完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、STM32的USART窗口通讯程序
要求 1)设置波特率为115200,1位停止位,无校验位。硬件介绍 本人使用的是野火的野火MINI开发板,芯片是STM32F103RCT6 很方便的一点就是电脑安装CH340驱动后就可以实现USB转串口,用USB线就能实现串口通讯,不需要额外的购置串口线或者USB转串口的配件 USART介绍 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据 组织)SIRENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。 使用多缓冲器配置的DMA方式,可以实现高速数据通信。 寄存器标志位 状态SR常用: 数据DR常用: 波特率BRR常用: 还有 主要是发送/接受使能和中断使能(Enable) 串口初始化需要设置的(以本实验代码位例子): 步骤实例: 1. 串口时钟使能 2.忽略 3.GPIO端口模式设置 GPIO端口模式设置可以在上面提到的手册的8.1.11 查表 输入模式相关:上拉输入、下拉输入、浮空输入、模拟输入的区别 这里注意到GPIO_TX的模式设置的是推挽复用,原因如下: 因为是串口不在时普通的IO口所以复用, 这样,输出口的GPIO设置完成 接收口的GPIO,注意这里是pin_10,TX是pin_9, 接收口用到是浮空/带上拉 输入 4.串口参数初始化 //USART相关寄存器设置 void User_USART_Config(void) { USART_InitTypeDef USART_Config; //使能USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //初始化USART_InitTypeDef结构体 USART_Config.USART_BaudRate = 115200; //波特率 USART_Config.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制(此处不用) USART_Config.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送和接收使能设置 USART_Config.USART_Parity = USART_Parity_No; //奇偶校验位 (此处不用) USART_Config.USART_StopBits = USART_StopBits_1; //停止位 USART_Config.USART_WordLength = USART_WordLength_8b; //字长(可以是8或9位) //设置USART1对应的寄存器 USART_Init(USART1, &USART_Config); //使能USART1 数据接收RXEN中断寄存器,即接收数据寄存器有数据可读时,RXEN寄存器产生中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能串口USART1,使其进行工作 USART_Cmd(USART1, ENABLE); } USART_Init函数第二个参数是结构体类型指针,所有必须先定义一个结构体 2/3步无先后顺序 我们因为需要的是全双工的通讯 所有这里3的mode同时使能了发送TX和接收口RX 5.开启中断并且初始化NVIC 开启接收中断 ITConfig:中断使能函数 USART_IT_RXNE函数在上文已经说过了,为读取器寄存非空函数 跟GPIO类似初始化入口函数Init 并设置优先级组 初始化结构体 6.使能串口 使用Cmd函数 7.编写中断处理函数 这里我们要求中断发生的条件是接收到了数据 中断发生后,判断接收到的字符是否为“Stop Stm32” 如果是,则停止发送,如果不是则继续发送 8.串口数据收发 这里我不需要任何中断服务,就把原程序的回显函数删掉了 9.串口传输状态获取 主函数 int main(void) { DEBUG_UART_Config(); //USART_SendData(DEBUG_USARTx, 'a'); // printf->fputc->USART_SendData->µçÄÔµÄÉÏλ»ú while(1) { uint8_t ucTemp; uint8_t StopFlag[]="stop,stm32"; uint16_t len,i; int Flag_s=1; /************************/ uint8_t flag1=0; delay(100000); printf("hello windows!rn"); /****************************/ if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET) { len=DEBUG_USARTx->DR & (uint16_t)0x01FF; ucTemp = USART_ReceiveData(DEBUG_USARTx); for(i=0;i if(StopFlag==ucTemp)Flag_s=0; if(BeginFlag==ucTemp)Flag_s=0; } if(Flag_s==1) { flag1=1; } } if(flag1==1)break; } } |
|
|
|
只有小组成员才能发言,加入小组>>
3125 浏览 9 评论
2821 浏览 16 评论
3334 浏览 1 评论
8705 浏览 16 评论
3923 浏览 18 评论
9542浏览 3评论
876浏览 3评论
446浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
450浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2173浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 15:38 , Processed in 0.904583 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号