代码直接黏贴的,备注有点乱码,以前插入c文本的现在没有了额。。。
问题:这两个定时器我是用来做串口1和485的超时接收用的,
在我调usart1和timer3的时候就收完一串数据超时就强制标记接收完成;
后来我添加了usart2和timer7就导致timer3在接收完一串数据后无法进入更新中断。
为什么不能同时用????
#include "timer.h"
#include "led.h"
#include "RS485.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//¶¨Ê±Æ÷ÖжÏÇý¶¯´úÂë
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
TIM_HandleTypeDef TIM3_Handler; //¶¨Ê±Æ÷¾ä±ú 3
TIM_HandleTypeDef TIM7_Handler; //¶¨Ê±Æ÷¾ä±ú 7
//ͨÓö¨Ê±Æ÷3Öжϳõʼ»¯
//arr£º×Ô¶¯ÖØ×°Öµ¡£
//psc£ºÊ±ÖÓÔ¤·ÖƵÊý
//¶¨Ê±Æ÷Òç³öʱ¼ä¼ÆËã·½·¨:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=¶¨Ê±Æ÷¹¤×÷ƵÂÊ,µ¥Î»:Mhz
//ÕâÀïʹÓõÄÊǶ¨Ê±Æ÷3!(¶¨Ê±Æ÷3¹ÒÔÚAPB1ÉÏ£¬Ê±ÖÓΪHCLK/2)
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //ͨÓö¨Ê±Æ÷3
TIM3_Handler.Init.Prescaler=psc; //·ÖƵϵÊý
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //ÏòÉϼÆÊýÆ÷
TIM3_Handler.Init.Period=arr; //×Ô¶¯×°ÔØÖµ
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//ʱÖÓ·ÖƵÒò×Ó
HAL_TIM_Base_Init(&TIM3_Handler);
HAL_TIM_Base_Start_IT(&TIM3_Handler); //ʹÄܶ¨Ê±Æ÷3ºÍ¶¨Ê±Æ÷3¸üÐÂÖжϣºTIM_IT_UPDATE
__HAL_TIM_CLEAR_IT(&TIM3_Handler, TIM_IT_UPDATE);//Çå¸üÐÂÖжÏ
__HAL_TIM_DISABLE(&TIM3_Handler);
}
//¶¨Ê±Æ÷3ÖжϷþÎñº¯Êý
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
void TIM7_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM7; //ͨÓö¨Ê±Æ÷7
TIM3_Handler.Init.Prescaler=psc; //·ÖƵϵÊý
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //ÏòÉϼÆÊýÆ÷
TIM3_Handler.Init.Period=arr; //×Ô¶¯×°ÔØÖµ
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//ʱÖÓ·ÖƵÒò×Ó
HAL_TIM_Base_Init(&TIM7_Handler);
HAL_TIM_Base_Start_IT(&TIM7_Handler); //ʹÄܶ¨Ê±Æ÷7ºÍ¶¨Ê±Æ÷7¸üÐÂÖжϣºTIM_IT_UPDATE
__HAL_TIM_CLEAR_IT(&TIM7_Handler, TIM_IT_UPDATE);//Çå¸üÐÂÖжÏ
__HAL_TIM_DISABLE(&TIM7_Handler);
}
//¶¨Ê±Æ÷3ÖжϷþÎñº¯Êý
void TIM7_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM7_Handler);
}
//»Øµ÷º¯Êý£¬¶¨Ê±Æ÷ÖжϷþÎñº¯Êýµ÷ÓÃ
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
LED1=!LED1; //LED1·´×ª
USART2_RX_STA|=1<<15;//±ê¼Ç´®¿Ú½ÓÊÕÍê³É
__HAL_TIM_DISABLE(htim);//ʧÄÜTIM3
}
if(htim==(&TIM7_Handler))
{
LED0=!LED0; //LED1·´×ª
USART_RX_STA|=1<<15;//±ê¼Ç´®¿Ú½ÓÊÕÍê³É
__HAL_TIM_DISABLE(htim);//ʧÄÜTIM7
}
}
//¶¨Ê±Æ÷µ×²áÇý¶¯£¬¿ªÆôʱÖÓ£¬ÉèÖÃÖжÏÓÅÏȼ¶
//´Ëº¯Êý»á±»HAL_TIM_Base_Init()º¯Êýµ÷ÓÃ
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //ʹÄÜTIM3ʱÖÓ
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //ÉèÖÃÖжÏÓÅÏȼ¶£¬ÇÀÕ¼ÓÅÏȼ¶1£¬×ÓÓÅÏȼ¶3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //¿ªÆôITM3ÖжÏ
}
if(htim->Instance==TIM7)
{
__HAL_RCC_TIM7_CLK_ENABLE(); //ʹÄÜTIM7ʱÖÓ
HAL_NVIC_SetPriority(TIM7_IRQn,1,2); //ÉèÖÃÖжÏÓÅÏȼ¶£¬ÇÀÕ¼ÓÅÏȼ¶1£¬×ÓÓÅÏȼ¶2
HAL_NVIC_EnableIRQ(TIM7_IRQn); //¿ªÆôITM7ÖжÏ
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>