IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【蓝桥杯-嵌入式设计与开发项目-USART应用程序设计】 -> 正文阅读

[嵌入式]【蓝桥杯-嵌入式设计与开发项目-USART应用程序设计】

一、实现的功能

  • ①LED1 ~ LED8显示0~255的二进制数,每过1s添加1;
  • ②LCD把LED显示的数字实时显示到LCD屏幕上面;
  • ③使用串口使用三种不同的方式把实时数据打印出来
  • ④运行串口接收中断,通过串口助手更新实时数据;

二、根据功能实现代码

1、主文件main.c

#include"key.h"
#include"led.h"
#include"lcd.h"
#include "usart.h"

unsigned char ucSec,ucSec1;
unsigned char pucStr[21];
unsigned char pucRcv[5] = " \0 ",ucRno = 3;
unsigned long ulTick_ms;

void LCD_Proc(void);
void USART_Proc(void);

int main(void)
{
	SysTick_Config(72000);	//定时1ms(HCLK = 72MHz)
	KEY_Init();
	LED_Init();
	
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	USART2_Init(9600);
	while(1)
	{
		LED_Disp(ucSec);
		LCD_Proc();
		USART_Proc();
	}
}
	void LCD_Proc(void)
	{
		sprintf((char*)pucStr,"		%02u	",ucSec);
		LCD_DisplayStringLine(Line5,pucStr);
	}
	
	void USART_Proc(void)
	{
		if(ucSec !=ucSec1)
		{
			ucSec1 = ucSec;
			
			USART_SendChar(USART2,ucSec/10+0x30);
			USART_SendChar(USART2,ucSec%10+0x30);
			USART_SendChar(USART2,' ');
			
			pucRcv[0] = ucSec/10+0x30;
			pucRcv[1] = ucSec%10+0x30;
			USART_SendString(USART2,pucRcv);
			
			printf(" %s\r\n",pucRcv);
		}
		if(ucRno ==5)
		{
			ucRno = 3;
			ucSec = (pucRcv[3]-'0')*10 + pucRcv[4]-'0';
		}
	}
//SysTick 中断处理程序
	void SysTick_Handler(void)
	{
		ulTick_ms++;
		if(ulTick_ms % 1000 ==0)
		ucSec++;
	}
	//USART2中断处理程序
	void USART2_IRQHandler(void)
	{
		pucRcv[ucRno++] = USART_ReceiveData(USART2);
	}
	

主函数分析:?? ?? ??

  1. 通过USART_SendChar()把实时数据的每一个位转换成字符,通过串口打印到串口助手;
  2. 把实时数据的每一个位转换成字符保存到字符数组中,通过USART_SendString()打印字符数组(即字符串);
  3. 通过重写printf()函数实现串口的打印;
  4. 把串口接收到的字符保存到数组中,当发送的了两位数给开发板时,计算串口发送数据(-‘0’),更新正在计算的值;
  5. 中断服务函数的命名必须按照向量表进行定义,否则程序会卡死在启动文件的B .处,可到startup_stm32f10x_md.s启动文件复制向量表名;

2、USART头文件“usart.h”

#include "stm32f10x.h"
#include "stdio.h"

void USART2_Init(unsigned long ulBaud);
unsigned char USART_SendChar(USART_TypeDef* USARTx,unsigned char ucChar);
void USART_SendString(USART_TypeDef* USARTx,unsigned char* pucStr);

简要分析:?? ??

  1. 声明了USART2的初始化串口发送字符和字符串函数

3、USART源文件“usart.c”

#include "usart.h"

void USART2_Init(unsigned long ulBaud)
{
	//初始化结构体
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	//允许GPIOA和USART2时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	
	//PA2-Tx2复用推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//PA3-TX2浮空输入(复位状态,可以省略)
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//初始化USART2(波特率ulBaud,默认8个数据位,1个停止位,无校验,允许Rx和Tx)
	USART_InitStruct.USART_BaudRate = ulBaud;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Init(USART2,&USART_InitStruct);
	//允许USART2
	USART_Cmd(USART2,ENABLE);
	//允许USART2中断
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
	//允许NVIC USART2中断
	NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority =0;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
	
}

//发送字符
unsigned char USART_SendChar(USART_TypeDef* USARTx,unsigned char ucChar)
{
	while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE));
	USART_SendData(USARTx,ucChar);
	return ucChar;
}

//发送字符串
void USART_SendString(USART_TypeDef* USARTx,unsigned char* pucStr)
{
	while(*pucStr !='\0')
		USART_SendChar(USARTx,*pucStr++);
}

//printf调用函数
int fputc(int ch,FILE *f)
{
	return(USART_SendChar(USART2,ch));
}

简要分析:?? ??

  1. 串口初始化:①把PA2(TX2)、PA3(RX2)分别初始化为复用推挽输出和浮空输入②配置USART2的参数③配置NVIC USART2嵌套中断的参数
  2. 配置USART2的详细步骤:①声明USART_InitTypeDef结构体变量②使能端口时钟(挂在APB1总线) → ③配置串口的波特率、默认8个数据位、1个停止位、无校验,允许Rx与Tx,无硬件数据流控制④调用Init函数初始化结构体
  3. 配置NVIC USART2中断的详细步骤:①声明NVIC_InitTypeDef结构体变量②使能USART2和接收(发送)中断③配置NVIC结构体的USART2中断向量,抢占优先级、子优先级、IRQ通道使能④调用Init函数初始化NVIC结构体
  4. 定义发送字符函数,首先使用while获取到发送标志位,然后调用固件库USART_SendData把字符发出去,而发送字符串就是把字符数组的每一位字符发送出去;
  5. 覆写printf为串口打印输出函数,需要在Target中勾选“Use MicroLIB” 才能正常使用;

三、实现功能过程的注意与学习点

1、注意点

  1. 中断服务函数的命名必须按照向量表的定义,否则无法正常中断;
  2. 覆写printf为串口打印输出函数,需要在Target中勾选“Use MicroLIB” 才能正常使用;

2、学习的知识点

  1. 字符 - ‘0’ = 数字,掌握字符与数字的转换;
  2. 掌握三种串口打印实时数据的方法;
  3. 学会通过固件库配置串口与中断的初始化步骤;
  4. 实现printf的覆写,调用printf实现串口的打印输出;
    ?? ?? ?? ?? ?? ??
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:16:35  更:2022-04-15 00:17:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:20:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码