stm32f407 6路串口dma如何配置_stm32cubeMX学习十、扫码模块程序开发(基于正点原子STM32F407开发板)...
本程序编写基于正点原子STM32F407开发板。
本文使用的扫码模块是下面这个品牌。
扫码模块的应用场景非常广泛,我们可以上百度搜索一下:
等等。
今天就来说说如何在开发板上实现控制它吧,打开数据手册看引脚配置。
该模块是基于串口开发,本例程只接了上述的5个引脚,其余的没有接入。
按手册提供的说明,只要我们每次扫码之前将nTrig管脚拉低,即可激活扫码模块,我们先接上Uart测试下效果,在没有接nTrig脚的时候,是下面这个样子,此时为非扫码模式。
当将nTrig引脚接地时,是下面这个样子,此时扫码模式激活,只需随便拿一个条码接近光源就可以得到数据输出。
关于模块的详细配置信息,可以参考数据手册:LV3096集成手册。https://download.csdn.net/download/morixinguan/11603322
接下来开始配置CubeMX,驱动这个模块。
一、配置IO和串口以及OS
1.1、配置普通IO
其中PE0就是图中的nTrig引脚,PE3为按键,当按键按下时,触发nTrig引脚为低电平。
PF8为蜂鸣器,即成功收到扫码模块返回的数据后,会一声,PF9和PF10为指示灯。
1.2、配置串口
串口2用来打印信息。
串口3是扫码模块,根据手册提示,该模块的默认波特率为9600。
配置全局中断。
1.3、配置FreeRtos
由于我的项目需要带OS,所以顺便也把OS配置上吧,把软件定时器勾上,其它的选项默认即可。
注意,配置了FreeRtos,要把这里的时钟源改掉,以免冲突。
1.4、配置时钟
默认配置为168MHz
1.5、生成代码
二、编写相关逻辑
在main.c中添加头文件
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* USER CODE END Includes */
在main.c中定义任务和信号量
/* USER CODE BEGIN PV */
//判断当前是否在OS
__IO int start_os = 0;
//扫码任务
osThreadId ScanTaskHandle;
//按键任务
osThreadId KeyTaskHandle;
//得到扫码数据的信号量
SemaphoreHandle_t Scan_Data_Semaphore = NULL;
/* USER CODE END PV */
在stm32f4xx_hal_msp.c中串口三的用户定义区域使能串口3接收中断。
/* USER CODE BEGIN USART3_MspInit 1 *///这里不需要发送__HAL_UART_DISABLE_IT(huart, UART_IT_TC);__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);/* USER CODE END USART3_MspInit 1 */
编写扫码模块串口中断服务函数
/*** @brief This function handles USART3 global interrupt.*/
void USART3_IRQHandler(void)
{/* USER CODE BEGIN USART3_IRQn 0 *///加热器串口中断服务函数uint32_t ulReturn;uint8_t Res;portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;//进入临界段,不可被中断if(1 == start_os)ulReturn = taskENTER_CRITICAL_FROM_ISR();if((__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) != RESET)) //接收中断(接收到的数据必须是0x0d 0x0a结尾){HAL_UART_Receive(&huart3, &Res, 1, 1000);if('n' != Res){USART3_RX_BUF[scan_rx_count++] = Res ;}else{//如果接收的是n,则上一个接收的数据为'r'结束if('r' == USART3_RX_BUF[scan_rx_count - 1]){//添加结束符USART3_RX_BUF[scan_rx_count - 1] = 0x00 ;//接收计数清0scan_rx_count = 0 ;//给出一个信号量if(1 == start_os)xSemaphoreGiveFromISR(Scan_Data_Semaphore, &xHigherPriorityTaskWoken);}}}/* USER CODE END USART3_IRQn 0 */HAL_UART_IRQHandler(&huart3);/* USER CODE BEGIN USART3_IRQn 1 *///退出临界段if(1 == start_os)taskEXIT_CRITICAL_FROM_ISR( ulReturn );/* USER CODE END USART3_IRQn 1 */
}
在main.c中创建信号量和任务函数
创建信号量
//创建一个二值信号量,用于传感器数据的接收处理Scan_Data_Semaphore = xSemaphoreCreateBinary();assert_param(NULL != Scan_Data_Semaphore);
创建任务函数
/* USER CODE BEGIN RTOS_THREADS *//* add threads, ... */osThreadDef(ScanTask, StartScanTask, osPriorityNormal, 0, 128);ScanTaskHandle = osThreadCreate(osThread(ScanTask), NULL);osThreadDef(KeyTask, StartKeyTask, osPriorityNormal, 0, 128);KeyTaskHandle = osThreadCreate(osThread(KeyTask), NULL);/* USER CODE END RTOS_THREADS */
编写应用逻辑
/* USER CODE BEGIN 4 */
//按键处理任务
void StartKeyTask(void const * argument)
{while(1){//当按键按下时候,触发扫码模块if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin))HAL_GPIO_WritePin(START_SCAN_GPIO_Port, START_SCAN_Pin, GPIO_PIN_RESET);osDelay(200);}
}extern uint8_t scan_rx_count;
extern uint8_t USART3_RX_BUF[UART_RECV_LEN] ;
//扫码处理任务
void StartScanTask(void const * argument)
{start_os = 1 ;BaseType_t xResult;uint8_t *__Scan_Data_Cpy = NULL ;__Scan_Data_Cpy = malloc(UART_RECV_LEN);assert_param(NULL != __Scan_Data_Cpy);while(1){//等待获取一个信号量,portMAX_DELAY表示无超时限制xResult = xSemaphoreTake(Scan_Data_Semaphore, portMAX_DELAY);if(xResult == pdTRUE){memset(__Scan_Data_Cpy, 0, UART_RECV_LEN);memcpy(__Scan_Data_Cpy, USART3_RX_BUF, strlen((char *)USART3_RX_BUF));printf("扫码数据:%sn",__Scan_Data_Cpy);memset(USART3_RX_BUF,0,UART_RECV_LEN);//关闭扫码使能HAL_GPIO_WritePin(START_SCAN_GPIO_Port, START_SCAN_Pin, GPIO_PIN_SET);//蜂鸣器鸣叫一声HAL_GPIO_WritePin(BELL_GPIO_Port,BELL_Pin,GPIO_PIN_SET);osDelay(150);HAL_GPIO_WritePin(BELL_GPIO_Port,BELL_Pin,GPIO_PIN_RESET);}}
}
/* USER CODE END 4 */
三、运行结果
按下按键KEY1激活扫码模块
拿一个有条码的本子
靠近扫码枪,识别到条形码后,扫码枪会将光源关断,如需要再次使用,需要再按下KEY1按键开启。
串口收到的打印结果,和本子上的条形码的数据是一样的。
stm32f407 6路串口dma如何配置_stm32cubeMX学习十、扫码模块程序开发(基于正点原子STM32F407开发板)...相关推荐
- 基于Stm32f407 的贪吃蛇小游戏【正点原子-探索者开发板】
基于单片机stm32f407的单机小游戏----贪吃蛇小游戏 1.介绍 这是我花一个星期完成的一个简单地单机贪吃蛇小游戏项目,芯片是stm32f407,项目是基于正点原子-探索者开发板完成的,有需要的 ...
- 正点原子stm32F407学习笔记1——新建工程模板
一.基于固件库 1.新建文件夹 新建一个Template文件夹,在此文件夹下新建五个子文件夹 2.打开keil软件,点击菜单栏Project –>New Uvision Project,如果有其 ...
- Linux开发环境配置--正点原子阿尔法开发板
Linux开发环境配置–正点原子阿尔法开发板 文章目录 Linux开发环境配置--正点原子阿尔法开发板 1.网络环境设置 1.1添加网络适配器 1.2虚拟网络编辑器设置 1.3Ubuntu和Windo ...
- 基于正点原子开拓者FPGA串口的Modelsim仿真程序
基于正点原子开拓者FPGA串口的Modelsim仿真程序 这是基于正点原子开拓者FPGA串口例程(10_uart_top)自我编写的仿真程序 `timescale 1 ns/ 1 ps module ...
- 正点原子stm32F407探索者 贪吃蛇
注:此代码只测试于正点原子stm32F407探索者,其他情况请自行修改 画圆函数在:https://blog.csdn.net/Higashino_Keigo/article/details/8871 ...
- 基于正点原子F407探索者STM32CUBEMX配置LWIP
基于正点原子F407探索者STM32CUBEMX配置LWIP 无操作系统: Ping_RAW: 第一步:配置系统时钟 第二步:打开定时器6 第三步:配置ETH 配置phyaddr 配置ETH的参数 配 ...
- 基于STM32F407标准库串口DMA+空闲中断
核心板:STM32F407 实验目的:通过DMA接收串口发来的数据,并且利用串口空闲中断在将这些数据发送至串口助手. 在通常我们使用串口接收数据时,会使能串口接收中断,并在每次接收到数据后会进入中断将 ...
- stm32 ucosii消息队列 串口_正点原子STM32F407探索者开发板资料连载第六十三章 UCOSII 实验...
1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weix ...
- stm32f407 spi3 mosi没有输出_正点原子STM32F407探索者开发板资料连载第56章 USB 读卡器实验
1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五十六章 USB 读 ...
最新文章
- acitivity 和fragment 通信,使用广播来传递信息的问题
- docker安装nginx实例
- Android4.4 framework分析——ActivityManagerService的启动和对Activity的管理
- 计蒜客NOIP模拟赛4 D2T2 跑步爱天天
- python 图片识别_python识别图片文字
- 机器学习难?那是你没看过这张路线图!
- quartz框架_定时任务调度框架Quartz
- python中filter(),reduce()函数
- 【.Net码农】Stream 和 byte[] 之间的转换
- RK3399外设驱动之PWM驱动:红外驱动
- 微信开放平台修改应用名称
- 湛江景点旅游攻略!究竟有哪些你不容错过的景点?
- 小游戏系列——猜数字游戏
- [E::hts_idx_push] NO_COOR reads not in a single block at the end 10 -1
- 《控制论导论》读书:基本概念
- 绘制奥林匹克五环旗。
- java操作hfds——黄磊
- java ctr_分组密码_计数器(CTR)模式_原理及java实现
- Unity打包PC包时,在WIN7环境下播放视频崩溃问题的解决记录
- jspdf与zip.js结合。解决转pdf文件清晰度与文件过大的问题
热门文章
- Tellico-经管你的收藏品
- Sql Server 2005“该用户与可信的SQL SERVER 连接无关联”解决方法
- 五个 PostgreSQL 典型故障案例及处理
- 简单易用线上引流测试工具:GoReplay
- linux中,添加cvs用户,实质就是添加linux用户 (extssh 连接方式)。 (添加时,注意是否要分组。)
- C#使用SmtpClient发送邮件解决授权码配置问题
- 解决在IDEA 的Maven下 出现 Cannot access in offline mode 问题
- 通过手动抛自定义异常实现spring事务回滚
- EF异常:“System.InvalidOperationException”类型的未经处理的异常在 mscorlib.dll 中发生
- SourceTree/git解决pre-commit hook failed的问题