完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
什么是串口通信?
外部设备通过TXD,RXD两个端口和单片机进行通信。 STM32串口配置常用的相关库函数 USART_DeInit(); //复位 USART_Init(); //串口初始化 USART_Cmd(); //串口使能 USART_ITConfig(); //串口中断使能 USART_SendData(); //发送数据 USART_ReceiveData(); //接收数据 USART_GetFlagStatus(); //获取状态标志位 USART_ClearFlag(); //清除状态标志位 USART_GetITStatus(); //获取中断状态标志位 USART_ClearITPendingBit(); //清除中断状态标志位 串口配置过程(以USART1串口为例子,PA9和PA10) ①串口时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //串口时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //复用功能时钟使能 ②GPIO端口初始化 通过查表《stm32开发手册V10》的8.1.11查看端口复用为串口时,IO口应该设置成什么模式 PA9为TX,应该设置成推挽复用输出 PA10为RX,应该设置成浮空输入或上拉输入,这里我们选择浮空输入 GPIO_InitTypeDef GPIO_Initstrue; GPIO_Initstrue.GPIO_Mode=GPIO_Mode_AF_PP; //推挽复用输出 GPIO_Initstrue.GPIO_Pin=GPIO_Pin_9; GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstrue); GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Initstrue.GPIO_Pin=GPIO_Pin_10; GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstrue); ③串口复位(非必需) USART_DeInit(USART1); 1 ④串口参数初始化 USART_InitTypeDef USART_Initstrue; USART_Initstrue.USART_BaudRate=115200; //波特率为115200 USART_Initstrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制为无 USART_Initstrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //收发使能 USART_Initstrue.USART_Parity=USART_Parity_No; //奇偶校验位为无 USART_Initstrue.USART_StopBits=USART_StopBits_1; //停止位为1 USART_Initstrue.USART_WordLength=USART_WordLength_8b; //字节数据长度为8为 USART_Init(USART1,&USART_Initstrue); //串口初始化函数 ⑤使能串口 USART_Cmd(USART1,ENABLE); ⑥开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); NVIC_InitTypeDef NVIC_Initstrue; NVIC_Initstrue.NVIC_IRQChannel=USART1_IRQn; //在stm32f10x.h头文件里面找到 NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE; NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=1; NVIC_Initstrue.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_Initstrue); ⑦编写中断处理函数 void USART1_IRQHandler(void) //USART1_IRQHandler是在启动文件startup_stm32f10x_hd.s里面找到 { //该函数是一旦串口接收到数据,就进入到串口中断函数 u8 flag; //函数内再将接收到的数据原封不动的再发出去 if(USART_GetITStatus(USART1,USART_IT_RXNE)) { flag =USART_ReceiveData(USART1); USART_SendData(USART1,flag); } } 配置实例 void Init(void) { GPIO_InitTypeDef GPIO_Initstrue; USART_InitTypeDef USART_Initstrue; NVIC_InitTypeDef NVIC_Initstrue; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //串口时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //复用功能时钟使能 GPIO_Initstrue.GPIO_Mode=GPIO_Mode_AF_PP; //推挽复用输出 GPIO_Initstrue.GPIO_Pin=GPIO_Pin_9; GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstrue); GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Initstrue.GPIO_Pin=GPIO_Pin_10; GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstrue); USART_DeInit(USART1); USART_Initstrue.USART_BaudRate=115200; //波特率为115200 USART_Initstrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制为无 USART_Initstrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //收发使能 USART_Initstrue.USART_Parity=USART_Parity_No; //奇偶校验位为无 USART_Initstrue.USART_StopBits=USART_StopBits_1; //停止位为1 USART_Initstrue.USART_WordLength=USART_WordLength_8b; //字节数据长度为8为 USART_Init(USART1,&USART_Initstrue); //串口初始化函数 USART_Cmd(USART1,ENABLE); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); NVIC_InitTypeDef NVIC_Initstrue; NVIC_Initstrue.NVIC_IRQChannel=USART1_IRQn; //在stm32f10x.h头文件里面找到 NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE; NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=1; NVIC_Initstrue.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_Initstrue); } void USART1_IRQHandler(void) //USART1_IRQHandler是在启动文件startup_stm32f10x_hd.s里面找到 { //该函数是一旦串口接收到数据,就进入到串口中断函数 u8 flag; //函数内再将接收到的数据原封不动的再发出去 if(USART_GetITStatus(USART1,USART_IT_RXNE)) { flag =USART_ReceiveData(USART1); USART_SendData(USART1,flag); } } int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Init(); while(1); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1609 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1540 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
681 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1587 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
503浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 01:22 , Processed in 0.723760 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号