完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
第一次自己写完整的硬件驱动,发上来给大家看看,顺便吸收些改进方案,希望各位能够不吝赐教,指出代码的不足之处。同时我也很高兴这代码能给你带来帮助。
工程使用CubeMX创建,使用VS Code编程,单片机为STM32F103VCT6。 首先配置时钟,下载方式,开启USART以方便调试,这里就不具体展示了。开启某个定时器的输入捕获【Input Capture direct mode】预分频系数设为(72-1),开启捕获中断【TIM1 capture compare interrupt】优先级最好高一些(默认为0),其他设置默认。 这里以定时器1的通道一为例: 将红外接收模块的输出端接入PA8即可,由于STM32F103VCT6的最高主频为72MHz故预分频系数设为(72-1),这样可以使计数每1μs加一,方便计算时间,开启捕获中断: 生成代码。将IR.c及IR.h文件添加到工程中(这两个文件将会放在在文章的下面,有较全的注释) 在相应位置修改main.c: /* USER CODE BEGIN Includes */ #include "IR.h" /* USER CODE END Includes */ /* USER CODE BEGIN PV */ uint32_t temp = 0;//用于接收数据 /* USER CODE END PV */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if (IR_Scanf(&temp)) { printf("%Xrn", temp);//这里需要重定向至串口后使用 } } /* USER CODE END 3 */ /* USER CODE BEGIN 4 */ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获回调函数 { if (TIM1 == htim->Instance) { IR_CaptureCallback(); } } /* USER CODE END 4 */ 修改完成后即可编译下载。打开串口助手就可以看到遥控器发来的信息了。 基本上换个遥控器只需修改IR.h文件的内容就可以了,包括使用的定时器及其通道、各种逻辑的持续时间(我这个遥控器就不完全是NEC编码所以会有些不同,还请自己测试后修改)、是否检查编码正确性等可以方便修改的地方。 下面就是所需要的文件: IR.c: /* USER CODE BEGIN Includes */ #include "IR.h" /* USER CODE END Includes */ /* USER CODE BEGIN PV */ uint32_t temp = 0;//用于接收数据 /* USER CODE END PV */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if (IR_Scanf(&temp)) { printf("%Xrn", temp);//这里需要重定向至串口后使用 } } /* USER CODE END 3 */ /* USER CODE BEGIN 4 */ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获回调函数 { if (TIM1 == htim->Instance) { IR_CaptureCallback(); } } /* USER CODE END 4 */ IR.h: //csdn_可谓不低 #ifndef __IR_H #define __IR_H #include "main.h" #define IR_TIM htim1 #define IR_TIM_CHANNE TIM_CHANNEL_1 #define IR_us_LOGIC_0 560 #define IR_us_LOGIC_1 1640 #define IR_us_START 4480 #define IR_us_REPEAT_START 39350 #define IR_us_REPEAT_END 2220 #define IR_DEVIATION 100 //误差范围 #define IR_CHECK_ADDRESS 1 //1:检查地址位 0:取消 #define IR_CHECK_COMMAND 1 //1:检查数据位 0:取消 #define IR_CHECK_REPEAT 1 //1:检查重复 0:取消 void IR_Init(void); void IR_CaptureCallback(void); uint8_t IR_Scanf(uint32_t* data); #endif /*************************************** * 1 00FFA25D * 2 00FF629D * 3 00FFE21D * 4 00FF22DD * 5 00FF02FD * 6 00FFC23D * 7 00FFE01F * 8 00FFA857 * 9 00FF906F * * 00FF6897 * 0 00FF9867 * # 00FFB04F * up 00FF18E7 * left 00FF10EF * OK 00FF38C7 * right 00FF5AA5 * down 00FF4AB5 *****************************************/ /**************************************** * 放入捕获中断回调函数中使用,按需修改TIM1 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (TIM1 == htim->Instance) { IR_CaptureCallback(); } } ******************************************/ |
|
|
|
第一次自己写完整的硬件驱动,发上来给大家看看,顺便吸收些改进方案,希望各位能够不吝赐教,指出代码的不足之处。同时我也很高兴这代码能给你带来帮助。
工程使用CubeMX创建,使用VS Code编程,单片机为STM32F103VCT6。 首先配置时钟,下载方式,开启USART以方便调试,这里就不具体展示了。开启某个定时器的输入捕获【Input Capture direct mode】预分频系数设为(72-1),开启捕获中断【TIM1 capture compare interrupt】优先级最好高一些(默认为0),其他设置默认。 这里以定时器1的通道一为例: 将红外接收模块的输出端接入PA8即可,由于STM32F103VCT6的最高主频为72MHz故预分频系数设为(72-1),这样可以使计数每1μs加一,方便计算时间,开启捕获中断: 生成代码。将IR.c及IR.h文件添加到工程中(这两个文件将会放在在文章的下面,有较全的注释) 在相应位置修改main.c: /* USER CODE BEGIN Includes */ #include "IR.h" /* USER CODE END Includes */ /* USER CODE BEGIN PV */ uint32_t temp = 0;//用于接收数据 /* USER CODE END PV */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if (IR_Scanf(&temp)) { printf("%Xrn", temp);//这里需要重定向至串口后使用 } } /* USER CODE END 3 */ /* USER CODE BEGIN 4 */ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获回调函数 { if (TIM1 == htim->Instance) { IR_CaptureCallback(); } } /* USER CODE END 4 */ 修改完成后即可编译下载。打开串口助手就可以看到遥控器发来的信息了。 基本上换个遥控器只需修改IR.h文件的内容就可以了,包括使用的定时器及其通道、各种逻辑的持续时间(我这个遥控器就不完全是NEC编码所以会有些不同,还请自己测试后修改)、是否检查编码正确性等可以方便修改的地方。 下面就是所需要的文件: IR.c: /* USER CODE BEGIN Includes */ #include "IR.h" /* USER CODE END Includes */ /* USER CODE BEGIN PV */ uint32_t temp = 0;//用于接收数据 /* USER CODE END PV */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if (IR_Scanf(&temp)) { printf("%Xrn", temp);//这里需要重定向至串口后使用 } } /* USER CODE END 3 */ /* USER CODE BEGIN 4 */ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获回调函数 { if (TIM1 == htim->Instance) { IR_CaptureCallback(); } } /* USER CODE END 4 */ IR.h: //csdn_可谓不低 #ifndef __IR_H #define __IR_H #include "main.h" #define IR_TIM htim1 #define IR_TIM_CHANNE TIM_CHANNEL_1 #define IR_us_LOGIC_0 560 #define IR_us_LOGIC_1 1640 #define IR_us_START 4480 #define IR_us_REPEAT_START 39350 #define IR_us_REPEAT_END 2220 #define IR_DEVIATION 100 //误差范围 #define IR_CHECK_ADDRESS 1 //1:检查地址位 0:取消 #define IR_CHECK_COMMAND 1 //1:检查数据位 0:取消 #define IR_CHECK_REPEAT 1 //1:检查重复 0:取消 void IR_Init(void); void IR_CaptureCallback(void); uint8_t IR_Scanf(uint32_t* data); #endif /*************************************** * 1 00FFA25D * 2 00FF629D * 3 00FFE21D * 4 00FF22DD * 5 00FF02FD * 6 00FFC23D * 7 00FFE01F * 8 00FFA857 * 9 00FF906F * * 00FF6897 * 0 00FF9867 * # 00FFB04F * up 00FF18E7 * left 00FF10EF * OK 00FF38C7 * right 00FF5AA5 * down 00FF4AB5 *****************************************/ /**************************************** * 放入捕获中断回调函数中使用,按需修改TIM1 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (TIM1 == htim->Instance) { IR_CaptureCallback(); } } ******************************************/ |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
3410 浏览 0 评论
3383 浏览 9 评论
3069 浏览 16 评论
3558 浏览 1 评论
9202 浏览 16 评论
1319浏览 3评论
678浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
673浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2423浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1986浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-3-6 17:37 , Processed in 1.182823 second(s), Total 48, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191