STM32之USART
Posted nwjlq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32之USART相关的知识,希望对你有一定的参考价值。
(2):对printf scanf进行重定向且利用串口控制开发板上的LED灯(输入奇数LED1亮 偶数LED1灭)
重点:1.对c语言中的输入输出重定向必须配置keil使用微软lib库并且加入头文件stdio.h( #include<stdio.h> )
2:重写fputc fgetc函数。
LED原理图:
头文件:注意添加stdio.h头文件
#ifndef _USART_H #define _USART_H #include "stm32f10x.h" #include <stdio.h> //发送引脚配置 #define USART_TX_CLK RCC_APB2Periph_GPIOA #define USART_TX_PORT GPIOA #define USART_TX_PIN GPIO_Pin_9 //接收引脚配置 #define USART_RX_CLK RCC_APB2Periph_GPIOA #define USART_RX_PORT GPIOA #define USART_RX_PIN GPIO_Pin_10 //串口配置 #define USART USART1 #define USART_CLK RCC_APB2Periph_USART1 void USART_Config(void);//初始化 #endif
USART配置:
//引脚初始化 static void USART_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; //开启TX RX端口时钟 RCC_APB2PeriphClockCmd(USART_TX_CLK|USART_RX_CLK,ENABLE); //TX引脚初始化 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽 GPIO_InitStruct.GPIO_Pin=USART_TX_PIN; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(USART_TX_PORT,&GPIO_InitStruct); //RX引脚初始化 GPIO_InitStruct.GPIO_Pin=USART_RX_PIN; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(USART_RX_PORT,&GPIO_InitStruct); } //模式初始化 static void USART_Mode_Config(void) { USART_InitTypeDef USART_InitStruct; //开启串口时钟 RCC_APB2PeriphClockCmd(USART_CLK,ENABLE); USART_InitStruct.USART_BaudRate=115200;//波特率配置 USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//模式 发送 接收模式 USART_InitStruct.USART_Parity=USART_Parity_No;//是否开启校验 USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位 USART_InitStruct.USART_WordLength=USART_WordLength_8b;//数据长度 8位 USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//是否硬件流控制 USART_Init(USART,&USART_InitStruct);//初始化 USART_Cmd(USART,ENABLE);//使能USART串口 } //初始化 void USART_Config(void) { USART_GPIO_Config();//GPIO配置 USART_Mode_Config();//USART模式配置 }
发送数据辅助函数:
//发送一个字节函数 static void USART_SendByteData(uint8_t data) { USART_SendData(USART,data); while(USART_GetFlagStatus(USART,USART_FLAG_TXE)==RESET);//等待发送完成 }
重写fputc fgetc函数:
//重定向 printf puts putchar函数 int fputc(int ch,FILE*fp) { USART_SendByteData(ch); return ch; } //重定向 scanf gets getchar int fgetc(FILE*fp) { while(USART_GetFlagStatus(USART,USART_FLAG_RXNE)==RESET);//等待接收数据 return USART_ReceiveData(USART); }
main函数:
#include "stm32f10x.h" #include "usart.h" void LED_Config(void);//LED0引脚初始化 int main() { uint8_t value=0; USART_Config(); LED_Config(); while(1) { value=getchar(); value-=48;//字符数字与实际的数值相差48 if(value%2==1) GPIO_ResetBits(GPIOC,GPIO_Pin_0);//点亮 else GPIO_SetBits(GPIOC,GPIO_Pin_0);//熄灭 } } void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; //开启时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStruct);//初始化 GPIO_SetBits(GPIOC,GPIO_Pin_0);//默认熄灭 }
注意:字符数字与实际的数值相差48:
效果:
以上是关于STM32之USART的主要内容,如果未能解决你的问题,请参考以下文章