OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14885|回复: 2

STM32 串口传输--Alientek源码

[复制链接]

98

主题

408

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2010-12-14
在线时间
0 小时
发表于 2010-12-18 02:11:28 | 显示全部楼层 |阅读模式

usart文件夹内包含了usart.cusart.h两个文件。这两个文件用于串口的初始化和中断接收。这里只是针对串口1,比如你要用串口2或者其他的串口,只要对代码稍作修改就可以了。usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32 pclk2u32 bound);里面还有一段对串口printf的支持代码,如果去掉,则会导致printf无法使用,虽然软件编译不会报错,但是硬件上STM32是无法启动的。这段代码不要去修该。

void USART1_IRQHandler(void)函数是一个串口1中断响应函数,当串口1发生了相应的中断后,就会跳到该函数执行。这里我们设计了一个小小的接收协议:通过这个函数,配合一个数组USART_RX_BUF[64],一个接收状态寄存器USART_RX_STA实现对串口数据的接收管理。USART_RX_BUF的最大值为64,也就是一次接收的数据最大不能超过64个字节。USART_RX_STA是一个接收状态寄存器其各的定义如下表:

USART_RX_STA

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

接收完成标志

接收到0X0D标志

接收到的有效数据个数

                                        2.7.2.2接收状态寄存器位定义表

设计思路如下:

当接收到从电脑发过来的数据,把接收到的数据保存在USART_RX_BUF中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(0X0D0X0A)的第一个字节0X0D时,计数器将不再增加,等待0X0A的到来,而如果0X0A没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到0X0A,则标记USART_RX_STA的第七位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到0X0D,那么在接收数据超过64个了,则会丢弃前面的数据,重新接收。函数代码如下:

/ #ifdef EN_USART1_RX   //如果使能了接收

//串口1中断服务程序

//注意,读取USARTx->SR能避免莫名其妙的错误            

u8 USART_RX_BUF[64];     //接收缓冲,最大64个字节.

//接收状态

//bit7,接收完成标志

//bit6,接收到0x0d

//bit5~0,接收到的有效字节数目

u8 USART_RX_STA=0;       //接收状态标记             

 

void USART1_IRQHandler(void)

{

     u8 res;      

     if(USART1->SR&(1<<5))//接收到数据

     {         

                 res=USART1->DR;

                 if((USART_RX_STA&0x80)==0)//接收未完成

                 {

                             if(USART_RX_STA&0x40)//接收到了0x0d

                             {

                                         if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

                                         else USART_RX_STA|=0x80;      //接收完成了

                             }else //还没收到0X0D

                             {         

                                         if(res==0x0d)USART_RX_STA|=0x40;

                                         else

                                         {

                                                     USART_RX_BUF[USART_RX_STA&0X3F]=res;

                                                     USART_RX_STA++;

                                                     if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收        

                                         }                     

                             }

                 }                                                                                                                                       

     }                                                                                                                                   

}

#endif                               

从上面的代码我们可以看使用了宏定义#ifdef,当需要使用串口接收的时候,我们只要在usart.h里面定义EN_USART1_RX就可以了。不使用的时候,注释掉就可,这样可以省出部分sramflash

void uart_init(u32 pclk2u32 bound)函数是串口1初始化函数。该函数有2个参数,第一个为pclk2,是系统的时钟频率。第二个参数为需要设置的波特率,例如9600115200等。而这个函数的重点在与设置波特率。在《STM32参考手册》的第480页,24.4.4一节有详细介绍波特率的计算方式。这里我们不再详细介绍。uart_init在不同pclk2频率下初始化的不同波特率有些会存在误差,具体可以参考《STM32参考手册》的第481页的表154。需要注意的是这里初始化的串口都是按8位数据格式,1位停止位,无奇偶校验位的。具体代码如下:

//初始化IO 串口1

//pclk2CLK2时钟频率(Mhz)

//bound:波特率

void uart_init(u32 pclk2u32 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位停止,无校验位.

#ifdef EN_USART1_RX                    //如果使能了接收

     //使能接收中断

     USART1->CR1|=1<<8;    //PE中断使能

     USART1->CR1|=1<<5;    //接收缓冲区非空中断使能                 

     MY_NVIC_Init(33USART1_IRQChannel2);//2,最低优先级

#endif

}

 

usart.rar

2.01 KB, 下载次数: 642

希望openedv能给大家提供一个友好的技术交流平台!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-7-15
在线时间
2 小时
发表于 2012-7-15 11:35:29 | 显示全部楼层
你好,如果用USART2传输,具体程序应该怎么改动呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-15 13:51:03 | 显示全部楼层
论坛有例程,你搜索一下就可以了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-22 12:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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