本帖最后由 WoodData 于 2020-8-11 21:44 编辑
下面测试一下通用外设驱动:红外按键解码。
首先配置串口0,等下方便调试信息输出。串口115200,使用TIM2作为波特率定时器。
然后添加红外接收模块,红外接收模块需要用到外部中断和定时器资源。本次红外接收头使用INT1的P16引脚。如下:
下面配置TIM1作为红外接收解码的定时时基,红外解码库要求50us。TIM1时钟32MHz,12分频,计算定时器重载值。
下面是程序主要流程,主函数main里面首先初始化红外解码库SCD_IR_Decode_Init(),然后循环检测红外解码成功标志,并通过串口输出解码值。
TIM1中断调用红外解码库函数SCD_IR_BaseTime();
外部中断调用红外解码函数SCD_IR_Decode();
下面是生成的代码部分。这里要注意下官方外设库里面的串口发送没有检测发送完成中断标志,所以要自己重新写。
官方的库是这样的:
73 /*****************************************************
74 *函数名称:void UART0_SendData8(uint8_t Data)
75 *函数功能:UART0发送8位数据
76 *入口参数:uint8_t Data 发送的数据
77 *出口参数:void
78 *****************************************************/
79 void UART0_SendData8(uint8_t Data)
80 {
81 SBUF = Data;
82 }
83
84 /**************************************************
85 *函数名称:uint8_t UART0_ReceiveData8(void)
86 *函数功能:获得SBUF中的值
87 *入口参数:void
88 *出口参数:uint8_t
89 **************************************************/
90 uint8_t UART0_ReceiveData8(void)
91 {
92 return SBUF;
93 }
158 /*****************************************************
159 *函数名称:FlagStatus UART0_GetFlagStatus(UART0_Flag_Typedef UART0_Flag)
160 *函数功能:获得UART0中断标志状态
161 *入口参数:UART0_Flag 中断标志位选择
162 *出口参数:FlagStatus UART0中断标志状态
163 *****************************************************/
164 FlagStatus UART0_GetFlagStatus(UART0_Flag_Typedef UART0_Flag)
165 {
166 return (FlagStatus)(SCON & UART0_Flag);
167 }
168
169 /*****************************************************
170 *函数名称:void UART0_ClearFlag(UART0_Flag_Typedef UART0_Flag)
171 *函数功能:清除UART0中断标志状态
172 *入口参数:UART0_Flag 中断标志位选择
173 *出口参数:void
174 *****************************************************/
175 void UART0_ClearFlag(UART0_Flag_Typedef UART0_Flag)
176 {
177 SCON &= (~UART0_Flag);
178 }
我将上面重新写了发送函数:
50 //串口发送字节。
51 void UartSendChar(uint8_t ch)
52 {
53 UART0_SendData8(ch);
54 while(UART0_GetFlagStatus(UART0_FLAG_TI) == 0);
55 UART0_ClearFlag(UART0_FLAG_TI);
56 }
效果如下,成功检测到了红外按键。在串口有按键输出值。
|