请问一下CH573的PA9引脚用作TMR0功能可以做输入捕获用来进行红外解码吗?解码NEC需要判断高低电平的持续时间,是需要用另一个定时器的计数功能才可以实现吗?如果要判断低电平是否持续560us,那这个计数器计的数值为多少时才是560us呢?
CH57x CH58x 系列的芯片的26bit定时器的时钟直接来自 系统时钟,
当系统跑到32M 情况下, 每32代表1us, 在60M情况下每60代表1us;
上帖低电平持续560us, 当CH573 跑在60M的情况下, 560us captrue得到的值将会是60*360 = 33600这样
另外一个注意的地方是, capture工作模式下,timer的输出值的第26bit 指示的是采样时候的电平;
如下是在主频60Mhz下,timer开启双边沿captrue下,中断里面得到 us的处理(这里测试用到了打印,注意给合适的测试信号,避免打印速度影响结果)
__attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void TMR3_IRQHandler( void ) // TMR3 定时中断 { uint32_t cap_data; if ( TMR3_GetITFlag( TMR0_3_IT_DATA_ACT ) ) { TMR3_ClearITFlag( TMR0_3_IT_DATA_ACT ); // 清除中断标志 cap_data = TMR3_CAPGetData(); if(cap_data&(1<<25)){ //高电平 cap_data = cap_data&((1<<25)-1); PRINT("H gap=%d us\r\n",cap_data/60); }else{ PRINT("L gap=%d us\r\n",cap_data/60); } } }
初始化这样写对吗,用定时器0输入捕获
GPIOA_ResetBits( GPIO_Pin_9 ); // 配置PA9 GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeIN_PU ); TMR0_CapInit( Edge_To_Edge ); TMR0_CAPTimeoutCfg( 0xFFFFFFFF ); // 设置捕捉超时时间 PFIC_EnableIRQ( TMR0_IRQn );
还需要使能 TMR0_ITCfg( ENABLE, TMR0_3_IT_DATA_ACT );
void Init(void) { GPIOA_ResetBits( GPIO_Pin_9 ); // 配置PA9 GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeIN_PU ); TMR0_CapInit( Edge_To_Edge ); TMR0_CAPTimeoutCfg( 0xFFFFFFFF ); // 设置捕捉超时时间 TMR0_ITCfg( ENABLE, TMR0_3_IT_DATA_ACT ); PFIC_EnableIRQ( TMR0_IRQn ); } __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void TMR0_IRQHandler( void ) { uint32_t cap_data; if ( TMR0_GetITFlag( TMR0_3_IT_DATA_ACT ) ) { TMR0_ClearITFlag( TMR0_3_IT_DATA_ACT ); // 清除中断标志 cap_data = TMR0_CAPGetData(); if(cap_data&(1<<25)){ //高电平 cap_data = cap_data&((1<<25)-1); PRINT("H gap=%d us\r\n",cap_data/60); }else{ PRINT("L gap=%d us\r\n",cap_data/60); } } }
这是定时器输入捕获的代码,连接的是一个红外接收器,当我按下遥控器时串口打印的信息如下
逻辑分析仪捕捉的图像如下
任意边沿触发首先打印的应该是 L gap=9398 us吗,而且打印的高低电平与图像也对不上。请问这是什么问题。
打印的波特率是多少?如果是115200的话,中断里面打印的时间都比采样脉宽要宽,会影响采样。
这是9600波特率的打印,但是第一个被采样的电平不应该是低电平吗
你是上电同时有边沿输入,还是芯片先上电在输入的电平信号,你可以先测单个脉宽试试,打印的话,9600太慢了,1个字节就差不多1ms,影响采样。
方便给我发一下CH573触摸按键的吗
方便给我发一下CH573触摸按键的吗
方便给我发一下CH573触摸按键的吗
留个邮箱发给你
您好,我这里做了测试不在中断中打印,
while(1) { for(i=0;i<10;i++) { TMR1_Disable(); TMR1_PWMActDataWidth( 0 ); // 占空比 TMR1_Enable(); DelayMs(9); TMR1_Disable(); TMR1_PWMActDataWidth( 10000 ); // 占空比 TMR1_Enable(); if(cap_data&(1<<25)) //高电平 { cap_data = cap_data&((1<<25)-1); PRINT("H gap=%d us\r\n",cap_data/60); } else PRINT("L gap=%d us\r\n",cap_data/60); DelayMs(1000); } TMR1_PWMInit( Low_Level, PWM_Times_1 ); for(i=0;i<10;i++) { TMR1_Disable(); TMR1_PWMActDataWidth( 0 ); // 占空比 TMR1_Enable(); DelayMs(9); TMR1_Disable(); TMR1_PWMActDataWidth( 10000 ); // 占空比 TMR1_Enable(); if(cap_data&(1<<25)) //高电平 { cap_data = cap_data&((1<<25)-1); PRINT("H gap=%d us\r\n",cap_data/60); } else PRINT("L gap=%d us\r\n",cap_data/60); DelayMs(1000); } TMR1_PWMInit( High_Level, PWM_Times_1 ); } __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void TMR0_IRQHandler( void ) { if ( TMR0_GetITFlag( TMR0_3_IT_DATA_ACT ) ) { TMR0_ClearITFlag( TMR0_3_IT_DATA_ACT ); // 清除中断标志 cap_data = TMR0_CAPGetData(); if(cap_data&(1<<25)){ //高电平 }else{ } } }
串口打印的信息如图
每次前四组数不太正确,这个要怎么保证第一次的数据就是正确的呢
个人信息保护,已隐藏
已发,请查收
您好,能否麻烦帮我看一下那个问题