普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4884|回复: 1

STM32之 串口使用

[复制链接]

139

主题

382

帖子

1531

积分

金牌会员

Rank: 6Rank: 6

积分
1531
发表于 2015-9-14 16:04:26 | 显示全部楼层 |阅读模式
本帖最后由 scholarship 于 2015-9-14 16:04 编辑

串口能给我们编程调试带来很大帮助,STM32的串口使用起来也很简单,参考官方代码,然后对照STM32手册,就能找到相关寄存器设置,以及设置的先后顺序.
以下是我写的对串口操作的c文件,串口1测试无问题,串口2,3还未测试,各位可以根据自己的需要对void uart_init(u32 pclk2,u32 bound)里面的相应寄存器做修改.
  1. #include "sys.h"
  2. #include "usart.h"
  3. //支持适应不同频率下的串口波特率设置.
  4.    
  5. #ifdef __GNUC__         
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  7. #else
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  9. #endif
  10. //重定义C语言库函数printf到串口1
  11. //CHECK OK
  12. //091209
  13. PUTCHAR_PROTOTYPE
  14. {           
  15. USART1->DR=ch;//写一个字符到串口1   
  16.    while(1)//循环发送,直到发送完毕
  17. {
  18.   if(USART1->SR&0X40)break;//如果发送完了,跳出
  19. };   
  20.    return ch;
  21. }   
  22. //中断优先级管理/开启
  23. //CHECK OK
  24. //091209   
  25. void NVIC_Configuration(void)
  26. {
  27.   MY_NVIC_PriorityGroupConfig(0);//设置分组0  全部4位都是响应优先级        
  28. MY_NVIC_Init(0,1,USART1_IRQChannel,0);//响应优先级1,抢占优先级0(未配置)            
  29. }
  30. //串口1中断服务程序
  31. //注意,读取USARTx->SR能避免莫名其妙的错误   
  32. u8 rebuffer[14];//接收缓冲  
  33. u8 recount="0";   //接收完全     
  34. void USART1_IRQHandler(void)
  35. {
  36. u8 res;     
  37. if(USART1->SR&(1<<5))//接收到数据
  38. {  
  39.   res=USART1->DR;         
  40.   if(recount<14&&res>47&&res<58)//仅仅接收数据 (0~9)
  41.   {
  42.    rebuffer[recount]=res-'0';//得到ASCII
  43.    recount++;
  44.   }                  
  45. }  
  46. }            
  47. //初始化IO 串口1
  48. //pclk2:CLK2时钟频率(Mhz)
  49. //bound:波特率
  50. //CHECK OK
  51. //091209
  52. void uart_init(u32 pclk2,u32 bound)
  53. {   
  54. float temp;
  55. u16 mantissa;
  56. u16 fraction;   
  57. temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
  58. mantissa=temp;     //得到整数部分
  59. fraction=(temp-mantissa)*16; //得到小数部分  
  60.     mantissa<<=4;
  61. mantissa+=fraction;
  62. RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
  63. RCC->APB2ENR|=1<<14;  //使能串口时钟
  64. GPIOA->CRH=0X444444B4;//IO状态设置
  65.    
  66. RCC->APB2RSTR|=1<<14;   //复位串口1
  67. RCC->APB2RSTR&=~(1<<14);//停止复位        
  68. //波特率设置
  69.   USART1->BRR=mantissa; // 波特率设置  
  70. USART1->CR1|=0X200C;  //1位停止,无校验位.
  71. //使能接收中断
  72. USART1->CR1|=1<<8;    //PE中断使能
  73. USART1->CR1|=1<<5;    //接收缓冲区非空中断使能
  74. NVIC_Configuration(); //中断管理,不开启
  75. }
复制代码







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-3 19:33 , Processed in 0.083283 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表