本程序编写基于正点原子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开发板)...相关推荐

  1. 基于Stm32f407 的贪吃蛇小游戏【正点原子-探索者开发板】

    基于单片机stm32f407的单机小游戏----贪吃蛇小游戏 1.介绍 这是我花一个星期完成的一个简单地单机贪吃蛇小游戏项目,芯片是stm32f407,项目是基于正点原子-探索者开发板完成的,有需要的 ...

  2. 正点原子stm32F407学习笔记1——新建工程模板

    一.基于固件库 1.新建文件夹 新建一个Template文件夹,在此文件夹下新建五个子文件夹 2.打开keil软件,点击菜单栏Project –>New Uvision Project,如果有其 ...

  3. Linux开发环境配置--正点原子阿尔法开发板

    Linux开发环境配置–正点原子阿尔法开发板 文章目录 Linux开发环境配置--正点原子阿尔法开发板 1.网络环境设置 1.1添加网络适配器 1.2虚拟网络编辑器设置 1.3Ubuntu和Windo ...

  4. 基于正点原子开拓者FPGA串口的Modelsim仿真程序

    基于正点原子开拓者FPGA串口的Modelsim仿真程序 这是基于正点原子开拓者FPGA串口例程(10_uart_top)自我编写的仿真程序 `timescale 1 ns/ 1 ps module ...

  5. 正点原子stm32F407探索者 贪吃蛇

    注:此代码只测试于正点原子stm32F407探索者,其他情况请自行修改 画圆函数在:https://blog.csdn.net/Higashino_Keigo/article/details/8871 ...

  6. 基于正点原子F407探索者STM32CUBEMX配置LWIP

    基于正点原子F407探索者STM32CUBEMX配置LWIP 无操作系统: Ping_RAW: 第一步:配置系统时钟 第二步:打开定时器6 第三步:配置ETH 配置phyaddr 配置ETH的参数 配 ...

  7. 基于STM32F407标准库串口DMA+空闲中断

    核心板:STM32F407 实验目的:通过DMA接收串口发来的数据,并且利用串口空闲中断在将这些数据发送至串口助手. 在通常我们使用串口接收数据时,会使能串口接收中断,并在每次接收到数据后会进入中断将 ...

  8. stm32 ucosii消息队列 串口_正点原子STM32F407探索者开发板资料连载第六十三章 UCOSII 实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weix ...

  9. stm32f407 spi3 mosi没有输出_正点原子STM32F407探索者开发板资料连载第56章 USB 读卡器实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五十六章 USB 读 ...

最新文章

  1. acitivity 和fragment 通信,使用广播来传递信息的问题
  2. docker安装nginx实例
  3. Android4.4 framework分析——ActivityManagerService的启动和对Activity的管理
  4. 计蒜客NOIP模拟赛4 D2T2 跑步爱天天
  5. python 图片识别_python识别图片文字
  6. 机器学习难?那是你没看过这张路线图!
  7. quartz框架_定时任务调度框架Quartz
  8. python中filter(),reduce()函数
  9. 【.Net码农】Stream 和 byte[] 之间的转换
  10. RK3399外设驱动之PWM驱动:红外驱动
  11. 微信开放平台修改应用名称
  12. 湛江景点旅游攻略!究竟有哪些你不容错过的景点?
  13. 小游戏系列——猜数字游戏
  14. [E::hts_idx_push] NO_COOR reads not in a single block at the end 10 -1
  15. 《控制论导论》读书:基本概念
  16. 绘制奥林匹克五环旗。
  17. java操作hfds——黄磊
  18. java ctr_分组密码_计数器(CTR)模式_原理及java实现
  19. Unity打包PC包时,在WIN7环境下播放视频崩溃问题的解决记录
  20. jspdf与zip.js结合。解决转pdf文件清晰度与文件过大的问题

热门文章

  1. Tellico-经管你的收藏品
  2. Sql Server 2005“该用户与可信的SQL SERVER 连接无关联”解决方法
  3. 五个 PostgreSQL 典型故障案例及处理
  4. 简单易用线上引流测试工具:GoReplay
  5. linux中,添加cvs用户,实质就是添加linux用户 (extssh 连接方式)。 (添加时,注意是否要分组。)
  6. C#使用SmtpClient发送邮件解决授权码配置问题
  7. 解决在IDEA 的Maven下 出现 Cannot access in offline mode 问题
  8. 通过手动抛自定义异常实现spring事务回滚
  9. EF异常:“System.InvalidOperationException”类型的未经处理的异常在 mscorlib.dll 中发生
  10. SourceTree/git解决pre-commit hook failed的问题