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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 串口输入注册 -> 正文阅读

[嵌入式]串口输入注册

上一张我们构建了设备输入层构建。本节我们基于这个架构上进行串口注册

代码参考了吃肉同学的作业,已获得他的允许发表文章

本文代码并非完整,只贴了核心部分

/*----------------------------------------------------正文从这里开始----------------------------------------------------*/

第一部分

模仿GPIO的方式,我们首先在Input文件夹里面创建一个C文件,用来注册串口输入

按照gpio_key.c的规律,我取名为usart_msg.c

[usart_msg.c]


/*为串口构造一个InputDevice*/

static int USARTMsgInit(void)
{
	KAL_USARTMsgInit();
	return 0;
}

static InputDevice g_tUSARTDevice = {
	"usart_msg",    //设备名字
	NULL,        //依旧是通过中断实现InputEvent的打包和发送,所以这里依然是NULL
	USARTMsgInit,  //初始化函数  
	NULL,    //退出函数
            //此处还应有一个struct InputDevice *pNext成员,链表Next指针会在下面函数中赋值,因此这里先空着
};

void AddInputDeviceUSARTMsg(void)
{
    InputDeviceRegister(&g_tUSARTDevice);
}

?初始化函数KAL_USARTMsgInit()在KAL层里面

[kal_usart_msg.c]


void KAL_USARTMsgInit(void)
{
	/*裸机:注册中断*/
	CAL_USARTMsgInitForChip();



	/*RTOS:创建任务*/
	/*此处放RTOS的代码*/
}

继续递进,到CAL层

[cal_usart_msg.c]

void CAL_USARTMsgInitForChip(void)
{
	//调用芯片相关代码,注册GPIO中断
	  MX_USART1_UART_Init();
	
}

此处进行usart的最底层的初始化,由于我们在使用STM32CUBEMX时已经对UART进行初始化,函数在usart.c中已经写好,并在main.c中已经调用(代码如下所示),因此这里我们写不写都可以,心里清楚就好

[usart.c]

void MX_USART1_UART_Init(void)
{    
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart1) != HAL_OK)
    {
        Error_Handler();
    }
}

/*---------------------------------------------------------分割线---------------------------------------------------------*/

第二部分

完成了Init函数,我们接下来要实现信息的传递,也就是在中断中打包InputEvent并发送出去

例程之前已经写过串口中断函数了,driver_usart.c放在ModuleDrivers文件夹中,打开它修改一下

[driver_usart.c]

/*我们是接收完字符串之后用strcpy函数送进InputEvent的str中的,这里创建一个字符数组用于临时存放字符串。INPUT_BUF_LEN是input_system.h中的宏定义,是InputEvent结构体中的str数组容量*/
volatile static unsigned char Tmp[INPUT_BUF_LEN] = {0};	

volatile static unsigned char Cnt = 0;		//字符数组下标

static volatile uint8_t ucTxcplt = 0;    // 发送完成标志,1完成0未完成

static volatile uint8_t ucRxcplt = 0;    // 接收完成标志,1完成0未完成

static volatile uint16_t USART1_RX_LEN = 0;      //接收标记

extern ring_buffer test_buffer;    //我们在main.c中全局定义了一个环形缓冲区,专门用来放信息的,借来用用

只需要改写一下中断服务函数,我们用到的是RXNE位

[driver_usart.c]

void USART1_IRQHandler(void)
{
    unsigned char uctemp = 0;	//创建一个变量用来接收字符
	InputEvent event;	//创建一个事件结构体
	
    /*判断USART1的状态寄存器的RXNE位是否被置位*/
    if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) != RESET)   
    {
        /*有数据就存放到临时变量中,只读取一个字节,超时时间1秒*/
        HAL_UART_Receive(&huart1,&uctemp,1,1000);  

        /*将数据保存到环形缓冲区中*/
        ring_buffer_write(uctemp, &test_buffer); 

		Tmp[Cnt] = uctemp;	
		if(uctemp == '\n' || (Cnt+2 == INPUT_BUF_LEN))
		    {
		        event.time = KAL_GetTime();
				event.eType = INPUT_EVENT_TYPE_STDIO;
				event.iKey = 0;
				event.iPressure = 0;

                /*把字符串打包发到InputEvent结构体的str中,使用strcpy记得包含string.h*/
				strcpy(event.str,(const char*)Tmp);
    
				PutInputEvent(&event);    //发送事件
				Cnt = 0;    //字符数组下标清零

                /*清空临时存放数组中的内容,使用memset记得包含string.h*/
				memset( (void *)Tmp,0, INPUT_BUF_LEN);
			}
		else
			{
				Cnt++;
			}
      //RXNE读完硬件清除了,不用手动了

      /*HAL库中的UART统一中断服务函数,通过形参判断是要处理谁的中断*/
      HAL_UART_IRQHandler(&huart1); 
}

效果如下图所示

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-02 15:01:40  更:2021-10-02 15:03:15 
 
开发: 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 5:40:13-

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