完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段。比如我们调试程序,有时候需要把某些中间量或者其他程序状态信息打印出来,查看程序的运行情况。
本例程:学习如何使用 STM32 的串口来发送和接收数据。 将实现如下功能:STM32 通过串口和上位机的对话,STM32 在收到上位机发过来的字符串后,原原本本的返回给上位机。 STM32串口简介: 下面先重温串口通讯,然后再简单介绍 STM32 串口: 串行通信的定义 串口通信是指外设和计算机间,通过数据线、地线、控制线,按位进行传输数据的一种通信方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。 异步通信的数据格式 串口通信分为同步通信和异步通信,同步通信在我们实际的项目中用的不多,本章介绍的为串口最常用的方法,全双工、异步通讯方式。图为串口异步通讯协议。 从图中我们可以知道,在一帧格式中,先是一个起始位 0,然后是 8 个数据位,规定低位在前,高位在后,接下来是奇偶校验位(能省略),最后是停止位 1。用这种格式表示字符,则字符能一个接一个地传送。重温串口的通讯协议,我们知道要配置串口通讯,至少要设置以下几个参数:起始位,数据位,奇偶校验位,停止位,波特率。在 ST 库提供的初始化串口库函数中,有一个串口初始化结构体,这个结构体的几个成员就是有来存储这些控制参数的。对于软件开发人员来说,有 ST 公司的固件库,其实我们只要知道 USART 通过 3 个引脚与其它设备进行串口通信的就可以了,任何 USART 双向通信至少需要 2 个信号引脚:数据输入(RX)和数据输出(TX) ,和一个公共地。 例程程序如下所示: 例程程序如下所示: Main.c #include "stm32f10x.h" #include "config.h" #include "stdio.h" #include "stdbool.h" #include "stm32f10x_rtc.h" #define LED0_ON GPIO_ResetBits(GPIOA,GPIO_Pin_8); #define LED0_OFF GPIO_SetBits(GPIOA,GPIO_Pin_8); #define LED1_ON GPIO_ResetBits(GPIOD,GPIO_Pin_2); #define LED1_OFF GPIO_SetBits(GPIOD,GPIO_Pin_2); #define LED2_ON GPIO_ResetBits(GPIOC,GPIO_Pin_12); #define LED2_OFF GPIO_SetBits(GPIOC,GPIO_Pin_12); uint16_t command; void delay(uint32_t counter); int main(void) { LED_Config(); NVIC_Config(); USART1_Config(); while(1) { if(command == 0x0A) { LED0_ON; LED1_OFF; LED2_OFF; } delay(0xff); if(command == 0x0B) { LED0_OFF; LED1_ON; LED2_OFF; } delay(0xff); if(command == 0x0C) { LED0_OFF; LED1_OFF; LED2_ON; } } } void delay(uint32_t counter) { int i; for(;counter!=0x00;counter--) { for(i=0;i<1000;i++); } } void USART1_IRQHandler(void) { LED1_ON; if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { USART_ClearITPendingBit(USART1,USART_IT_RXNE); LED1_ON; command = USART_ReceiveData(USART1); delay(0x01); USART_SendData(USART1,command); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); delay(0xfff); LED1_OFF; } } config.c #include "stm32f10x.h" #include "config.h" #include "stdio.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_8); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_InitStructure); GPIO_SetBits(GPIOD,GPIO_Pin_2); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_12); //进行串口传输数据调试 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure); } void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); } void USART1_Config(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; 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); USART_Cmd(USART1,ENABLE); } Config.h #ifndef __CONFIG_H #define __CONFIG_H #include "stm32f10x.h" void LED_Config(void); void NVIC_Config(void); void USART1_Config(void); void RTC_Config(void); void RTC_Init(uint32_t counter); #endif |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 23:41 , Processed in 0.833672 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号