現在大部分手機上都有紅外遙控功能,而且好像大部分信號STM32都是可以收到的。現在就使用STM32發送紅外信號,由STM32上的紅外接收器接收后執行不同的操作。以下是注意事項:
在標準庫中有? EXTI_ClearITPendingBit(EXTI_Line15); 清除中斷位,使用HAL庫不用使用清除中斷位
在HAL庫中NVIC的設置在文件stm32f1xx_hal_cortex.c中
HAL_Delay并不能實現us的延時效果,要自己寫
? ? ? ? ? ? void delay_us(uint32_t i)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? uint32_t temp;
? ? ? ? ? ? ? ? SysTick->LOAD=9*i;
? ? ? ? ? ? ? ? SysTick->CTRL=0X01;
? ? ? ? ? ? ? ? SysTick->VAL=0;
? ? ? ? ? do
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? temp=SysTick->CTRL;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? while((temp&0x01)&&(!(temp&(1<<16))));
? ? ? ? ? ? ? SysTick->CTRL=0;
? ? ? ? ? ? ? SysTick->VAL=0;
? ? ? ? ? }
紅外接收器的數據引腳為PG15
PG15的設置
/*Configure GPIO pin : PG15 */
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;? //下降沿觸發
GPIO_InitStruct.Pull = GPIO_PULLUP;? //上拉模式
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
RCC設置72MHz,要注意,時鐘頻率不同,計算時使用的數值大小不同
要printf輸出到串口還是要重定向printf
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief? Retargets the C library printf function to the USART.
* @param? None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
手機遙控器鍵位對應編碼
1 紅外接收碼 926D22DD
2 紅外接收碼 926DA25D
3 紅外接收碼 926D629D
4 紅外接收碼 926D609F
5 紅外接收碼 926DE01F
6 紅外接收碼 926D827D
7 紅外接收碼 926D6897
8 紅外接收碼 926D02FD
9 紅外接收碼 926DAA55
0 紅外接收碼 926D12ED