首页 > 其他分享 >STM32串口及printf

STM32串口及printf

时间:2022-12-22 16:05:55浏览次数:49  
标签:NVIC USART 串口 printf STM32 InitStruct GPIO USART1

1,开启串口相关的时钟,GPIO,USART的时钟

2,配置GPIO,注TX引脚AF的(OD和PP试过都没啥问题),RX浮空输入

3,配置USART的结构体,NVIC的分组和结构体成员,

4,选择串口通信的中断触发信号;usart_itconfig()确定中断源

5,使能串口  CMD函数;

注意;USART_GetFlagStatus函数可检测串口标志位,通过检测串口的标志位防止串口掉帧,确保数据发生或者接收完,具体标志查看手册。

USART_GetITStatus();函数可检测串口是否产生中断标志,防止误动作。

void usart1_init(void)

{

GPIO_InitTypeDef GPIORX_InitStruct;//GPIORX结构体名称

NVIC_InitTypeDef NVIC_InitStruct;//NVIC结构体名称

USART_InitTypeDef USART_InitStruct;//串口结构体名称

GPIO_InitTypeDef GPIOTX_InitStruct;//GPIOTX结构体名称

//时钟开启

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

//TX引脚初始化

GPIOTX_InitStruct.GPIO_Mode= GPIO_Mode_AF_OD;

GPIOTX_InitStruct.GPIO_Pin=GPIO_Pin_9;

GPIOTX_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIOTX_InitStruct);

//rX引脚初始化

GPIORX_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIORX_InitStruct.GPIO_Pin=GPIO_Pin_10;

GPIORX_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIORX_InitStruct);

//NVIC分组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

//NVIC成员配置

NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn ;

NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;

NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

NVIC_Init(&NVIC_InitStruct);

//串口结构体成员配置

USART_InitStruct.USART_BaudRate=9600;

USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_InitStruct.USART_Mode= USART_Mode_Rx|USART_Mode_Tx;

USART_InitStruct.USART_Parity=USART_Parity_No;

USART_InitStruct.USART_StopBits=USART_StopBits_1;

USART_InitStruct.USART_WordLength=USART_WordLength_8b;

USART_Init(USART1,&USART_InitStruct);

//串口中断源选择

USART_ITConfig( USART1, USART_IT_RXNE,ENABLE);

//使能

USART_Cmd(USART1,ENABLE);

 }

//print函数重定向

int fgetc(FILE *f)

{  

while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

return (int)USART_ReceiveData(USART1);

}

//选择窗口通信打印 不可打印中文,要加#include "stdio.h"      #include "stdarg.h"  #include "string.h"

//打印为void u1_printf(char* fmt,...) 函数

//PRINTF的核心函数  

void USART_SendByte(USART_TypeDef* USARTx, uint16_t Data)

{

 /* Check the parameters */

 assert_param(IS_USART_ALL_PERIPH(USARTx));

 assert_param(IS_USART_DATA(Data));  

     /* Transmit Data */

 USARTx->DR = (Data & (uint16_t)0x01FF);

 while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);

}

//串口1printf函数 可根据串口改变函数参数 使用要在头文件声明

__align(8) char USART1_TxBuff[256];  

 void u1_printf(char* fmt,...)  

{  

unsigned int i =0,length=0;

va_list ap;

va_start(ap,fmt);

vsprintf(USART1_TxBuff,fmt,ap);

va_end(ap);

 length=strlen((const char*)USART1_TxBuff);

while(i<length)

{

 USART_SendByte(USART1,USART1_TxBuff[i]);  

 i++;  

}

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

}


使用 u1_printf("%d\n",a[i]);在函数中进行串口打印

串口中断服务函数

void USART1_IRQHandler(void)//只要读数据寄存器非空,就会进入中断函数

{

if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))//也可以用USART_GetITStatus();来判断

{

 USART_SendData(USART1, a++);//

while(USART_GetFlagStatus(USART1,USART_FLAG_TC));//确定发送完了信息,才出中断服务。

  }

USART_ClearFlag(USART1,USART_FLAG_RXNE);

}


标签:NVIC,USART,串口,printf,STM32,InitStruct,GPIO,USART1
From: https://blog.51cto.com/u_15919473/5962969

相关文章

  • STM32 SPI DMA 源码解析及总结
    一前言最近在调试stm32的SPI时候i,遇到了一个非常诡异的问题。中间花费了不少时间才把问题搞定。这中间暴露的问题值得反思。借此机会,还是梳理一下stm32的SPI的代码做......
  • STM32L431 移植 LiteOS 时 _ebss _Min_Heap_Size _Min_Stack_Size 未找到或未定义问题
    如下图所示,移植过程中未出现配置遗漏的情况,也没有配置错误的地方,但依旧报以下错误:个人猜测可能是Keil本身的问题,一直识别你的东西没有,所以不给你通过。因为,我配置了很......
  • STM32中断
    voidEXTI_INIT(void){ GPIO_InitTypeDefGPIO_InitStruct; //GPIO结构体名称 EXTI_InitTypeDefEXTI_InitStruct;//EXTID中断结构体名称 NVIC_InitTypeDefNVIC_Ini......
  • 关于STM32CAN通信中过滤器两种模式的配置
    一、关于问题的阐述:最近在完善vesc的CAN通信相关代码,在配置过滤器时碰到了问题。1.1 对过滤器的两种模式理解不全面1.1.1关于过滤器的掩码模式。当时由于......
  • STM32 SYSTICK定时
    SYSTICK定时寄存器CTRL  第16位  countflag    计时完成标志位,1为计时完成,第2位  CLKSOURCE  时钟选择第1位  TICKINT    SYSTICK定时器中断使......
  • 正点原子STM32-串口协议学习笔记
    bit15bit14bit13~0接收完成标志接收到0x0d接收到的有效字节数过程:接收abcd然后/n最后立结束标志位为1对数组USART2_RX_BUF[]处理时,发现数组不......
  • printf()和scanf()的*修飾符
    如果你不想預先設置字段的寬度,想通過程序來進行設定,則可以可以使用“*”來進行修飾字段的寬度,前提是在程序中要包含“*”和參數對應的值(比如%*d,那麽參數應該包含*和%d的值)......
  • STM32F103使用FSMC对接正点原子3.5寸TFTLCD屏幕
    fsmc的使用算是32里面有点绕的一个知识点,但是想明白了其实也没啥了。  首先我先放32个0在这儿:0000  0000  0000  0000  0000  0000  0000  0000  ......
  • STM32MP157开发板调试笔记
    作者:树哥邮箱:[email protected]一、前言​最近在ODYSSEY-STM32MP157C板子上移植arm-trusted-firmware、u-boot以及linux(其实这个开发板官方是有提供完整的......
  • snprintf 函数用法详解
    snprintf(),函数原型为intsnprintf(char*str,size_tsize,constchar*format,...)两点注意:(1)如果格式化后的字符串长度<size,则将此字符串全部复制到str中,并给其......