如何用stm32F407实现stm32串口通信协议?

STM32F407 串口编程USART1,USART2,USART3,UART4
串口设置的一般步骤可以总结为如下几个步骤:
串口时钟使能,GPIO时钟使能。
设置引脚复用器映射:调用GPIO_PinAFConfig函数。
GPIO初始化设置:要设置模式为复用功能。
串口参数初始化:设置波特率,字长,奇偶校验等参数。
开启中断并且初始化NVIC,使能中断(如果需要开启中断才需要这个步骤)。
使能串口。
编写中断处理函数:函数名格式为USARTxIRQHandler(x对应串口号)。
我们通过USART3简单介绍下这几个与串口基本配置直接相关的几个固件库函数。这些函数和定义主要分布在stm32f4xx_usart.h和stm32f4xx_usart.c文件中。
串口时钟和GPIO时钟使能。
串口是挂载在APB1下面的外设,所以使能函数为:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟
GPIO时钟使能,就非常简单,串口3对应着芯片引脚PB10,PB11。所以这里我们只需要使能GPIOB时钟即可:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
//使能GPIOB时钟
设置引脚复用器映射
引脚复用器映射配置,调用函数为: GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
//PB10复用为USART3 GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);//PA11复用为USART3
因为串口使用到PB10,PB11,所以我们要把PB10和PB11都映射到串口3。所以这里我们要调用两次函数。
对于GPIO_PinAFConfig函数的第一个和第二个参数很好理解,就是设置对应的IO口,如果是PB10那么第一个参数是GPIOB,第二个参数就是GPIO_PinSource10。第二个参数,实际我们不需要去记忆,只需去相应的配置文件找到外设对应的AF配置宏定义标识符即可,串口3为GPIO_AF_USART3。
GPIO端口模式设置:PA9和PA10要设置为复用功能。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
//GPIOB10与GPIOB11 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
串口参数初始化:设置波特率,字长,奇偶校验等参数
串口初始化是调用函数USART_Init来实现的,具体设置方法如下:
USART_InitStructure.USART_BaudRate =//一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式 USART_Init(USART3, &USART_InitStructure); //初始化串口
使能串口调用函数USART_Cmd来实现,具体使能串口3方法如下: USART_Cmd(USART3, ENABLE);
//使能串口
串口数据发送与接收。
STM32F4的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包
含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。
STM32库函数操作USART_DR寄存器发送数据的函数是: void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
通过该函数向串口寄存器USART_DR写入一个数据。
STM32库函数操作USART_DR寄存器读取串口接收到的数据的函数是: uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
通过该函数可以读取串口接受到的数据。
开启中断并且初始化NVIC,使能相应中断
这一步如果我们要开启串口中断才需要配置NVIC中断优先级分组。通过调用函数
NVIC_Init来设置。
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
//响应优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//IRQ 通道使能
NVIC_Init(&NVIC_InitStructure);
//根据指定的参数初始化VIC寄存器、
同时,我们还需要使能相应中断,使能串口中断的函数是: void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,
FunctionalState NewState)
这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是: USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断
我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是: USART_ITConfig(USART3,USART_IT_TC,ENABLE);
这里还要特别提醒,因为我们实验开启了串口中断,所以我们在系统初始化的时候需要先设置
系统的中断优先级分组,我们是在我们main函数开头设置的,代码如下: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
我们设置分组为2,也就是2位抢占优先级,2位响应优先级。
获取相应中断状态
当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
比如我们使能了串口发送完成中断,那么当中断发生了,
我们便可以在中断处理函数中调用这
个函数来判断到底是否是串口发送完成中断,方法是: USART_GetITStatus(USART3, USART_IT_TC)
返回值是SET,说明是串口发送完成中断发生。
中断服务函数
串口1中断服务函数为:
void USART3_IRQHandler(void) ;
当发生中断的时候,程序就会执行中断服务函数。然后我们在中断服务函数中编写我们相应的逻辑代码即可
初始化代码
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!您现在的位置是: >
推荐星级:
基于stm32f407的串口通讯程序
部分文件列表
基于stm32的串口通讯程序.docx
下载本资源的用户还喜欢
已有 248206 个资源
项 目 外 包stm32F407串口通讯怎么把收到的字符一个一个读出来,并且判断? - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
stm32F407串口通讯怎么把收到的字符一个一个读出来,并且判断?
11:47:19  
各位大神问一下,串口通讯怎么把我发送的字符一个一个读出来,并且判断。我自己写的程序有个bug,就是单独发送第一个字符,也是可以执行程序,而不是一定要验证两个字符才能执行程序。比如下面的程序,我发送a1,程序可以执行,但我发送a,程序也是可以执行的,这个怎么解决?
int main(void)
& & & & u8 Tx_Buf[8];& &//要发送的数据
& & & & u8
& & & & u16
& & & & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
& & & & delay_init(168);& & & & & & & & //延时初始化
& & & & uart_init(115200);& & & & //串口初始化波特率为115200
& & & & LED_Init();& & & & & & & && && & & & & & & & //初始化与LED连接的硬件接口&&
& & & & while(1)
& & & & & & & & if(USART_RX_STA&0x8000)
& & & & & & & & {& & & & & & & & & & & & & & & & & & & && &
& & & & & & & & & & & & len=USART_RX_STA&0x3//得到此次接收到的数据长度
& & & & & & & & & & & &
& & & & & & & & & & & & printf(&\r\n您发送的消息为:\r\n&);
& & & & & & & & & & & & for(t=0;t&t++)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & USART_SendData(USART1, USART_RX_BUF[t]);& && && &//向串口1发送数据
& & & & & & & & & & & & & & & & Tx_Buf[t]=USART_RX_BUF[t];
& & & & & & & & & & & & & & & & while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
& & & & & & & & & & & & }
& & & & & & & & & & & &
& & & & & & & & & & & & if(Tx_Buf[0]=='a'&&Tx_Buf[1]=='1')
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & LED1=!LED1;
& & & & & & & & & & & & & & & & & & & & delay_ms(100);
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & }& & & &
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & printf(&\r\n\r\n&);//插入换行
& & & & & & & & & & & & USART_RX_STA=0;
& & & & & & & & }
& & & & }& & & &
19:42:19  
加入运算机制,比方说特征码计算等,具体做法位发送数据包时发一个,接数据等待是否需要接收第二数据包,或者结束跳出,等第二数据包接到后,与第一联合进行验证,如果是需要执行段,就执行,如果否,中断跳回主程序首段。
15:57:14  
你已经有通讯协议,USART_RX_STA&0x8000 只要最后一位接收正确,就会把收到的数据都读出来,这个应该是例程上的程序吧,已OX0A,OX0B也就是回车结尾为判断符;
17:12:08  
你已经有通讯协议,USART_RX_STA&0x8000 只要最后一位接收正确,就会把收到的数据都读出来,这个应该是例程上的程序吧,已OX0A,OX0B也就是回车结尾为判断符;
& & & & & & & & & & & & if(Tx_Buf[0]=='a'&Tx_Buf[1]=='1')
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & LED1=!LED1;
& & & & & & & & & & & & & & & & & & & & & & & & delay_ms(100);
& & & & & & & & & & & & & & & & }& & & &
我用这个程序判断我收到的字符,当我收到 a1 这个字符的时候程序是可以执行的,但是我再发送 a 这个字符,程序也是会执行的,我要怎么才只能满足当我只收到 a1 这个字符才能执行程序?
20:40:06  
加入运算机制,比方说特征码计算等,具体做法位发送数据包时发一个,接数据等待是否需要接收第二数据包,或者结束跳出,等第二数据包接到后,与第一联合进行验证,如果是需要执行段,就执行,如果否,中断跳回主程序首段。 ...
本人新手,水平不够,你能不能写段例程给我看看
22:22:55  
这个要具体芯片和相关的数据手册。
13:28:14  
越努力,越幸运!
工程师职场
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司 上传我的文档
 下载
 收藏
粉丝量:313
所有文档均可在线免费浏览,需要的朋友请看好是否是自己需要的文档。所有资料来源于网络,仅供大家参考学习,版权归原作者。若有侵权,敬请及时告知,本人会及时删除侵权文档,竭诚全力为您服务!!!
 下载此文档
STM32f407 一个串口收传给另一个串口再发送出去串口收发设置
下载积分:1270
内容提示:STM32f407 一个串口收传给另一个串口再发送出去串口收发设置
文档格式:DOC|
浏览次数:433|
上传日期: 04:14:35|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1270 积分
下载此文档
该用户还上传了这些文档
STM32f407 一个串口收传给另一个串口再发送出去串口
关注微信公众号}

我要回帖

更多关于 stm32f429串口通信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信