采用定时器捕捉功能,只检测下降沿。
下面单片机是 STM32F103C8T6
这些都试过了,都能用。
解码正确。理论和实际值相符。
以下是全部代码,欢迎任意使用。
- /* USER CODE BEGIN 0 */
- uint16_t IR_thisVal = 0; //本次值
- uint16_t IR_lastVal = 0; //上次值
- uint16_t ICcont = 0; //接收计数
- uint16_t irflg = 0; //接收状态标志位
- uint32_t IRcode= 0x0; //红外接收到的数据16进制
- /* USER CODE END 0 */
- /* USER CODE BEGIN WHILE */
- // HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_2); //开始捕获 TIM4 的通道 2
- HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_1); //开始捕获 TIM4 的通道 2
- while (1)
- {
- printf("%X\n",IRcode);
- HAL_Delay(5000);
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 4 */
- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //捕获中断发生时执行
- {
- if (irflg == 0) //第一个下降沿
- {
- __HAL_TIM_SET_COUNTER(&htim4,0);
- IR_lastVal = 0;
- irflg = 1;
- }
-
- if (irflg == 1) //第二个下降沿
- {
- IR_thisVal = HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_1);
- if(IR_thisVal>1300&&IR_thisVal<1500) //判断引导成功
- {
- IR_lastVal =IR_thisVal;
- ICcont = 0;
- IRcode=0x0; //红外接收到的数据
- irflg = 2;
- }
- else
- {
- irflg = 0; //重新开始
- }
- }
- if (irflg == 2) //进入解码
- {
- IR_thisVal = HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_1);
- if(IR_thisVal-IR_lastVal<200)
- {
- IRcode|=0; //接收到 0
- }
- else
- {
- IRcode|=1; //接收到 1
- }
- IRcode<<=1; //左移一位.
- IR_lastVal = IR_thisVal;
- ICcont++;
- if(ICcont==32) //4个8bit
- {
- irflg = 0; //重新开始
-
- }
- }
- }
- /* USER CODE END 4 */
stm32F103C8的工程设置,加上面的代码,可以直接用了。
CubeMX工程设置
[ 此帖被lyy-cy在2018-04-27 11:52重新编辑 ]