文章目录[隐藏]
目录
一、引脚图:
注意:我们一般使用的USART2为PA3、PA2
二、部分代码:
1.usart.h:
#ifndef __USART_H
#define __USART_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
void usart2_Init(void);
void SendString(char *s);
#endif
2、usart.c:
#include "usart.h"
#include "stdio.h"
void usart2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
USART_InitTypeDef USART_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//GPIO端口设置
//USART1_RX GPIOA.3初始化
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//USART1_TX GPIOA.2
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//USART 初始化设置
USART_InitStruct.USART_BaudRate=115200; //串口波特率
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;//字长为8位数据格式
USART_Init(USART2,&USART_InitStruct);//初始化串口2
USART_Cmd(USART2,ENABLE);//使能串口12
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启串口接受中断
//Usart1 NVIC 配置
NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStruct);
}
void SendString(char *s)
{
while(*s)
{
USART_SendData(USART2,*s++);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)//USART_FLAG_TC 表示传输完毕;USART_FLAG_TXE表示发送缓冲区空
{}
}
}
int fputc(int ch, FILE *f) //重定义fputc函数
{
USART_SendData(USART2, (uint8_t) ch);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
{}
return ch;
}
u8 rx_buf[10];
u8 rx_count=0;
void USART2_IRQHandler(void) //串口2中断服务程序
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
rx_buf[rx_count++]=USART_ReceiveData(USART2);
printf("%c\n",rx_buf[rx_count]);
if(rx_count>=5)
{
rx_count=0;
}
}
}
3、main.c:
#include "stm32f10x.h"
#include "lcd.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include "stdio.h"
u32 TimingDelay = 0;
void Delay_Ms(u32 nTime);
int main(void)
{
u8 key_value;
u8 i=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
SysTick_Config(SystemCoreClock/1000);
STM3210B_LCD_Init();
LCD_Clear(Green);
LCD_SetBackColor(Black);//2
LCD_SetTextColor(White);//3
led_Init();
key_Init();
usart2_Init();
while(1);
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
该程序通过串口调试助手输入字符等于接收端收到的相同字符串
总结:
这里对蓝桥杯嵌入式的串口通信的主要代码做了部分描述,在串口通信的学习过程中注意同时需要配置GPIO、NVIC和USART。
初学者一定要实际操作烧入代码检查目标实现程度
文章若出现什么问题,谢谢及时反馈。
点个赞在走吧!!!!
版权声明:本文为CSDN博主「0x小创ii」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_53512119/article/details/122747567
暂无评论