STM32---03---USART(串口通信)

STM32—03—USART(串口通信)

3.编程要点解析:以USART1为例

  • 3.1 结构体详解
    USART结构体有两个,分别如下:
/*USART初始化结构体:该结构体必须配置*/
1 typedef struct {
2 uint32_t USART_BaudRate; 							// 波特率
3 uint16_t USART_WordLength; 						// 字长
4 uint16_t USART_StopBits; 							// 停止位
5 uint16_t USART_Parity; 							// 校验位
6 uint16_t USART_Mode; 								// USART模式:可以配置成收发一体
7 uint16_t USART_HardwareFlowControl; 				// 硬件流控制
8 } USART_InitTypeDef;

以及

/*USART时钟初始化结构体,一般USART用作异步通信,不需要配置*/
1 typedef struct {
2 uint16_t USART_Clock; 							// 时钟使能控制
3 uint16_t USART_CPOL; 								// 时钟极性
4 uint16_t USART_CPHA; 								// 时钟相位
5 uint16_t USART_LastBit; 							// 最尾位时钟脉冲
6 } USART_ClockInitTypeDef;

配置USART相关寄存器的过程:先初始化结构体,然后调用函数:void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

  • 3.2 编程要点

① 开时钟(GPIO、USART的时钟): 除了打开USART1时钟之外,也要打开对于的GPIO时钟,USART1的TX对应的引脚PA9的时钟,调用函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
USART1挂载在APB2高速时钟线上,调用函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

值得注意的是此时不需要打开AFIO的时钟,至于AFIO时钟什么时候打开,可以看这个人,讲的很好

②配置模式(复用推挽输出,浮空输入): USART1的TX对应引脚PA9的输出模式为:推挽复用模式,因为USART功能均为引脚的复用功能,输入模式为浮空输入。

③配置串口的工作参数,使用上述3.1中的函数配置即可。

④如果需要使用USART中断,则需要配置写配置NVIC的函数。

⑤调用函数:void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);来启用或禁用指定的USART中断,可以启用下列中断。
在这里插入图片描述
具体中断事件如下:
发送期间:发送完成、清除发送、发送数据寄存器空
接收期间:空闲总线检测、溢出错误、接收数据寄存器非空、校验错误、LIN断开符号检测

⑥使能串口(使CR1寄存器的UE位置1),调用函数:void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);

  • 3.3 编程过程中疏忽的点

①判断数据已经发送完成的标志有两个:TXE和TC位,TXE位用于检测发送数据寄存器空,而TC位检测数据是否发送完成,因为USART_CR寄存器只有DR[8:0]9位有效,因此在发送一个字节的数据时,可以判断TXE或者TC标志位,但是对于大数据传输时,使用TC位判断更加准确。
②判断数据已被接收,可以读取时,仅根据RXNE位判断即可

  • 3.4 USART编程常用函数讲解
void USART_DeInit(USART_TypeDef* USARTx);/*串口初始化重置*/		
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);/*串口初始化*/
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);/*串口使能,配置USART-CR1的UE位置1*/
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);/*串口中断配置*/
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);/*串口发生数据函数*/
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);/*串口接收数据函数*/
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);/*检查USART-SR寄存器的状态标志位是否设置*/
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);/*清除USART的标志位*/
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);/*中断状态位获取函数*/
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);/*中断状态位清除函数*/

其中FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);和ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);函数检查的标志位是一样的,只是用途不一样,前者用于检测数据是否发送、接收等等,而后者的函数主要用于中断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stm32串口1和串口3数据互通,经测试同时发256字节不丢包 void usart3_init(u32 bound) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOBʱÖÓ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //´®¿Ú3ʱÖÓʹÄÜ USART_DeInit(USART3); //¸´Î»´®¿Ú3 //USART3_TX PB10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_Init(GPIOB, &GPIO;_InitStructure); //³õʼ»¯PB10 //USART3_RX PB11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë GPIO_Init(GPIOB, &GPIO;_InitStructure); //³õʼ»¯PB11 USART_InitStructure.USART_BaudRate = bound;//²¨ÌØÂÊÒ»°ãÉèÖÃΪ9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ 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(USART3, &USART;_InitStructure); //³õʼ»¯´®¿Ú 3 USART_Cmd(USART3, ENABLE); //ʹÄÜ´®¿Ú //ʹÄܽÓÊÕÖÐ¶Ï USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆôÖÐ¶Ï //ÉèÖÃÖжÏÓÅÏȼ¶ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//ÇÀÕ¼ÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //×ÓÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC;_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ TIM4_Int_Init(1000-1,7200-1); //10msÖÐ¶Ï USART3_RX_STA=0; //ÇåÁã TIM_Cmd(TIM4,DISABLE); //¹Ø±Õ¶¨Ê±Æ÷7 } //´®¿Ú3,printf º¯Êý //È·±£Ò»´Î·¢ËÍÊý¾Ý²»³¬¹ýUSART3_MAX_SEND_LEN×Ö½Ú void u3_printf(char* fmt,...) { u16 i,j; va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); va_end(ap); i=strlen((const char*)USART3_TX_BUF); //´Ë´Î·¢ËÍÊý¾ÝµÄ³¤¶È for(j=0;j<i;j++) //Ñ­»··¢ËÍÊý¾Ý { while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï USART_SendData(USART3,USART3_TX_BUF[j]); } }
### 回答1: STM32-MATLAB/Simulink 可以通过串口进行数据流传输的过程如下: 首先,在MATLAB/Simulink环境中,我们需要使用串口通信模块来实现与STM32的通信。可以使用MATLAB/Simulink提供的串口通信模块,例如Serial Receive和Serial Send。 然后,在STM32固件中,我们需要使用函数来实现串口通信功能。可以使用STM32提供的HAL函数,例如HAL_UART_Receive()和HAL_UART_Transmit()。 接下来,我们需要将STM32与计算机连接起来,并通过串口进行数据传输。首先,将STM32的串口引脚连接到计算机的串口接口上。然后,在MATLAB/Simulink中选择正确的串口设备,并设置正确的波特率、数据位数、停止位数和奇偶校验等参数。 通过串口通信模块发送数据时,在Simulink模型中将要发送的数据与Serial Send模块相连接,并在其属性对话框中设置合适的配置参数。然后,在STM32固件中,使用HAL_UART_Transmit()函数将数据发送到计算机。 通过串口通信模块接收数据时,在Simulink模型中使用Serial Receive模块接收数据,并在其属性对话框中设置合适的配置参数。然后,在STM32固件中,使用HAL_UART_Receive()函数从计算机接收数据。 最后,我们可以在MATLAB/Simulink中编写相的处理算法,对接收到的数据进行处理和分析。 综上所述,通过在MATLAB/Simulink中使用串口通信模块,并在STM32固件使用函数,我们可以实现STM32与MATLAB/Simulink之间的数据流传输。这样可以方便地进行数据采集、分析和控制等操作。 ### 回答2: 在STM32中与Matlab Simulink进行串口数据流传输,可以通过以下步骤来实现: 1. 在STM32中编写代码,实现串口通信功能。首先需要初始化串口,并设置波特率和其他参数。然后,使用串口发送和接收数据的函数,将待传输的数据通过串口发送出去或接收到STM32的内存中。 2. 在Matlab Simulink中创建串口对象。打开Simulink模型,使用“Serial Configuration”模块来创建一个串口对象。配置串口参数,如串口号、波特率等。然后,在Simulink模型中添加“Serial Send”或“Serial Receive”模块,用于通过串口发送和接收数据。 3. 在模型中连接和配置串口对象和数据处理模块。将串口对象模块与数据处理模块连接起来,确保数据能够正确地从STM32中传输到Simulink模型中,或从Simulink模型传输到STM32中。 4. 编写STM32和Simulink之间的数据解析和处理代码。根据实际需求,编写STM32和Simulink之间的数据解析和处理代码,以确保数据能够正确地传输和处理。例如,使用特定的数据协议来解析和处理数据。 5. 调试和测试。将STM32与计算机连接,并通过Simulink模型发送和接收数据。使用示波器或其他工具来监视串口通信情况,确保数据传输正常,并且STM32和Simulink之间的数据处理正确。 总结:通过以上步骤,我们可以实现在STM32和Matlab Simulink之间进行串口数据流传输。在STM32中实现串口通信功能,然后在Simulink模型中创建和配置串口对象,并与数据处理模块连接起来。最后,编写数据解析和处理代码,并进行调试和测试,以确保数据传输和处理的正确性。 ### 回答3: STM32-MATLAB/Simulink是将STM32单片机与MATLAB/Simulink软件进行无缝连接的一种方法,可以通过串口进行数据流传输。 在STM32上,我们可以通过USART模块来实现串口通信。首先,需要在STM32固件中配置串口的参数,如波特率、数据位、停止位等。然后,通过编写相的代码来发送和接收数据。 在MATLAB/Simulink中,可以使用Serial Send和Serial Receive模块来进行串口数据的发送和接收。首先,通过Serial Send模块将数据发送到STM32单片机上的串口。然后,在STM32上的代码中,通过USART模块接收数据,并进行相的处理。最后,再通过Serial Receive模块将处理后的数据返回到MATLAB/Simulink中进行进一步的处理或显示。 需要注意的是,在使用串口进行数据流传输时,需要将发送和接收的波特率、数据位、停止位等参数保持一致,以确保数据的正确传输。另外,数据的格式也需要统一,可以选择使用ASCII码或二进制码进行数据的传输。 总之,通过STM32-MATLAB/Simulink及串口的结合,可以实现STM32单片机和MATLAB/Simulink之间的数据传输,为数据采集、系统控制等领域提供了一种便捷的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值