完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
采用中断方式通过USART1接收串口助手的发送的数据并且将数据在串口助手上打印出来
1、USART配置步骤 ①开时钟 ②配置USART1的IO端口 ③配置USART1的工作模式 ④配置NVIC ⑤使能串口 2、USART库函数讲解 /* *这些是串口的配置以及收发数据需要用到的库函数 */ void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); //USART配置函数 void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); //USART使能函数 void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); //USART的中断允许函数 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); //USART数据发送函数 uint16_t USART_ReceiveData(USART_TypeDef* USARTx); //USART数据接收函数 ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); //检查指定的USART中断是否发生 void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); //清除USART中断的指定标志位 3、USART代码示例 /* *usart.h 这里是BSP_GPIO端口的宏定义,便于后期代码修改和移植 */ // TX-PA9 输出 RX-PA10 接收 #define USART1_TX_PORT GPIOA #define USART1_TX_PIN GPIO_Pin_9 #define USART1_RX_PORT GPIOA #define USART1_RX_PIN GPIO_Pin_10 /* *usart.c 这里是配置函数主体 */ void usart_init(u32 bound) { RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_USART1, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_DeInit(USART1);//复位USART //USART1_GPIO_Config //TX PA9 GPIO_InitStructure.GPIO_Pin = USART1_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USART1_TX_PORT, &GPIO_InitStructure); //RX PA10 GPIO_InitStructure.GPIO_Pin = USART1_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//复用浮空输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USART1_RX_PORT, &GPIO_InitStructure); //USART1_Config USART_InitStructure.USART_BaudRate = bound;//波特率,函数入口参数 USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); //中断优先级配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); USART_Cmd(USART1,ENABLE); } 串口通讯的中断函数和主函数采用正点原子的代码 下列为正点原子官方代码,仅供学习参考。 /* *这是串口接收数据的重要函数,所有的收发数据都是通过下面这个中断函数实现 */ u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 u16 USART_RX_STA=0; //接收状态标记 /***********************************************************************/ void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a) USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d) USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } ```c /* *主函数 */ while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 printf("rn您发送的消息为:rnrn"); for(t=0;t USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } printf("rnrn");//插入换行 USART_RX_STA=0; }else { times++; if(times%200==0)printf("请输入数据,以回车键结束n"); if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行. delay_ms(10); } } 4.重要代码讲解 1、void USART1_IRQHandler(void) //串口1中断服务程序 1 代码先通过USART_GetITStatus()函数读取是否产生了指定的中断标志USART_IT_RXNE,产生中断后进入函数 (1)先通过USART_ReceiveData()函数将数据赋值给Res (2)USART_RX_STA的bit15 = 0 说明接收未完成 ①bit14 = 1说明接收到了0x0D,继续判断如果最新输入的数据Res = 0x0A,那么接收完成。 ②bit14 != 1 说明0x0D也没有接收到,那么检测新进来的Res,如果Res = 0x0D,那么将bit14赋值为1;如果Res != 0x0D,说明数据正在接收中,将Res的值写入数据缓冲数组中。 2、mian.c //主函数 首先验证USART_RX_STA的bit15位是否为1(是否输入了0x0A) (1)如果符合,计算数组长度,通过循环从串口打印出去 (2)如果不符合,等待并闪灯 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 08:08 , Processed in 0.766734 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号