|
本帖最后由 scholarship 于 2015-9-14 16:04 编辑
串口能给我们编程调试带来很大帮助,STM32的串口使用起来也很简单,参考官方代码,然后对照STM32手册,就能找到相关寄存器设置,以及设置的先后顺序.
以下是我写的对串口操作的c文件,串口1测试无问题,串口2,3还未测试,各位可以根据自己的需要对void uart_init(u32 pclk2,u32 bound)里面的相应寄存器做修改.- #include "sys.h"
- #include "usart.h"
- //支持适应不同频率下的串口波特率设置.
-
- #ifdef __GNUC__
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
- #else
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
- #endif
- //重定义C语言库函数printf到串口1
- //CHECK OK
- //091209
- PUTCHAR_PROTOTYPE
- {
- USART1->DR=ch;//写一个字符到串口1
- while(1)//循环发送,直到发送完毕
- {
- if(USART1->SR&0X40)break;//如果发送完了,跳出
- };
- return ch;
- }
- //中断优先级管理/开启
- //CHECK OK
- //091209
- void NVIC_Configuration(void)
- {
- MY_NVIC_PriorityGroupConfig(0);//设置分组0 全部4位都是响应优先级
- MY_NVIC_Init(0,1,USART1_IRQChannel,0);//响应优先级1,抢占优先级0(未配置)
- }
- //串口1中断服务程序
- //注意,读取USARTx->SR能避免莫名其妙的错误
- u8 rebuffer[14];//接收缓冲
- u8 recount="0"; //接收完全
- void USART1_IRQHandler(void)
- {
- u8 res;
- if(USART1->SR&(1<<5))//接收到数据
- {
- res=USART1->DR;
- if(recount<14&&res>47&&res<58)//仅仅接收数据 (0~9)
- {
- rebuffer[recount]=res-'0';//得到ASCII
- recount++;
- }
- }
- }
- //初始化IO 串口1
- //pclk2:CLK2时钟频率(Mhz)
- //bound:波特率
- //CHECK OK
- //091209
- void uart_init(u32 pclk2,u32 bound)
- {
- float temp;
- u16 mantissa;
- u16 fraction;
- temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
- mantissa=temp; //得到整数部分
- fraction=(temp-mantissa)*16; //得到小数部分
- mantissa<<=4;
- mantissa+=fraction;
- RCC->APB2ENR|=1<<2; //使能PORTA口时钟
- RCC->APB2ENR|=1<<14; //使能串口时钟
- GPIOA->CRH=0X444444B4;//IO状态设置
-
- RCC->APB2RSTR|=1<<14; //复位串口1
- RCC->APB2RSTR&=~(1<<14);//停止复位
- //波特率设置
- USART1->BRR=mantissa; // 波特率设置
- USART1->CR1|=0X200C; //1位停止,无校验位.
- //使能接收中断
- USART1->CR1|=1<<8; //PE中断使能
- USART1->CR1|=1<<5; //接收缓冲区非空中断使能
- NVIC_Configuration(); //中断管理,不开启
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|