完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
【 0. 通信的分类 】
根据不同的定义标准有以下不同的分类
特点
引脚连接方法: RXD(Receive External Data):数据输入引脚。 TXD(Transmit External Data):数据发送引脚。 【 2. 串口通信过程 】 【 3. 数据位 】
【 6. 相关寄存器 】 7. 相关函数 】 初始化串口 void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能 使能串口 void USART_Cmd(); //使能串口 串口发送数据 void USART_SendData(); //发送数据到串口,DR 串口接收数据 uint16_t USART_ReceiveData(); //接受数据,从DR读取接受到的数据 获取状态标志位 FlagStatus USART_GetFlagStatus(); //获取状态标志位 清除状态标志位 void USART_ClearFlag(); //清除状态标志位 使能串口中断 void USART_ITConfig(); //使能相关中断 获取串口中断标志位 ITStatus USART_GetITStatus(); //获取中断状态标志位 清除串口中断标志位 void USART_ClearITPendingBit(); //清除中断状态标志位 标志位核心代码 内部程序要求,发送的字符是以回车换行结束(0x0D,0x0A) 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;//接收错误,重新开始(0xod后应该是0x0a) else USART_RX_STA|=0x8000; //接收完成了 } else //上一次接收到的数据不是0x0d { if(Res==0x0d)USART_RX_STA|=0x4000; //这次接收到0x0d,标志位bit14置1 else //这次没接收到0x0d,接收到数据位 { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; //存入缓冲区 USART_RX_STA++; //有效数据个数+1 if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误(大于缓冲区预定长度),重新开始接收 } } } } 【 8. 配置过程 】 使能串口时钟,使能GPIO时钟。 配置GPIO端口模式(查表得)。 串口参数初始化。 开启中断并且初始化NVIC。(如果需要开启中断才需要这个步骤)。 使能串口。 编写中断处理函数。(如果需要开启中断才需要这个步骤)。 【 9. 范例 】 电脑发送字符到STM32,STM32接收并返回给电脑 #include "stm32f10x.h" void myUSART_InitTypeDef(void) { GPIO_InitTypeDef MyGPIOstruct; USART_InitTypeDef MyUSARTstruct; NVIC_InitTypeDef MyNVICstruct; /************①使能相应时钟***********/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //GPIO 时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //串口时钟使能 /*************②初始化GPIO口模式(查表得)*******/ MyGPIOstruct.GPIO_Mode=GPIO_Mode_AF_PP; //GPIO模式配置Pin9, TXD MyGPIOstruct.GPIO_Pin=GPIO_Pin_9; MyGPIOstruct.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&MyGPIOstruct); MyGPIOstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; //GPIO模式配置Pin10,RXD MyGPIOstruct.GPIO_Pin=GPIO_Pin_10; MyGPIOstruct.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&MyGPIOstruct); /***********③初始化串口参数***************/ MyUSARTstruct.USART_BaudRate=115200; //波特率配置 MyUSARTstruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //不适用硬件流 MyUSARTstruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //发送和接收均使能 MyUSARTstruct.USART_Parity=USART_Parity_No; //不使用奇偶校验位 MyUSARTstruct.USART_StopBits=USART_StopBits_1; //一个停止位 MyUSARTstruct.USART_WordLength=USART_WordLength_8b; //8位字长 USART_Init(USART1,&MyUSARTstruct); /************④中断配置******************/ USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启接收中断,接收数据后执行中断函数 MyNVICstruct.NVIC_IRQChannel=USART1_IRQn; //串口1入口参数 MyNVICstruct.NVIC_IRQChannelCmd=ENABLE; //使能 MyNVICstruct.NVIC_IRQChannelPreemptionPriority=1; //设置抢占优先级 MyNVICstruct.NVIC_IRQChannelSubPriority=1; //设置响应优先级 NVIC_Init(&MyNVICstruct); //设置相应中断响应优先级和抢占优先级 /************⑤使能串口******************/ USART_Cmd(USART1,ENABLE); //使能串口1 } /************⑥编写中断处理函数******************/ void USART1_IRQHandler(void) { u8 res1; if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)) //第二个参数确定中断类型,即接收中断 { res1=USART_ReceiveData(USART1); USART_SendData(USART1,res1); } } int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //系统优先级分组2 myUSART_InitTypeDef(); while(1); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
2159 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1835 浏览 1 评论
1321 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
864 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
2204 浏览 2 评论
2110浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
1020浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
393浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
721浏览 3评论
710浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-4-9 12:15 , Processed in 0.983862 second(s), Total 44, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191
|