打印
[其他]

AC7811QBGE 喂狗失败,求助!!-已解决

[复制链接]
4797|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1983万年青|  楼主 | 2021-10-27 10:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 1983万年青 于 2021-10-30 11:49 编辑

底层程序都是用的官方AutoGen 生成;
main()里面也没有别的程序, 只要PD11和 PB10/PC4/PB14 当中的任何一个一起输出就出现喂狗不成功的情况; 为什么确认是喂狗不成功,是通过更改看门狗复位时间确定,不同复位时间,对应的输出跳变是一致的;  

现在的疑问的main里面只有3行代码,但是还是在特定的情况下喂狗一直失败,最后复位。
是否有同样情况的伙伴,谢谢!

系统时钟96mhz, 下面的范例是10s看门狗复位情况,也试过1s,90ms情况都是在上面情况喂狗失败导致复位;

int main(void)
{
    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* MCU Configuration------------------------------------------------------*/

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    ATC_GPIO_Init();
    ATC_LIN0_Init();
    ATC_CAN2_Init();
    ATC_ADC_Init();
    ATC_PWM0_Init();
    ATC_PWM1_Init();
    ATC_PWM2_Init();
    ATC_WDG_Init();
    ATC_RTC_Init();

    /* USER CODE BEGIN 2 */

    /* USER CODE END 2 */

    /* Infinite loop */
    while(1)
    {

        /* USER CODE BEGIN WHILE */
                        WDOG_Feed();
               
                        
                        GPIO_SetPinValue(GPIO_PD11,1);
                        //GPIO_SetPinValue(GPIO_PB10,1);
                        GPIO_SetPinValue(GPIO_PC4,1);
                        //GPIO_SetPinValue(GPIO_PB14,1);
                        
                         //GPIO_SetPinValue(GPIO_PB7,1);
        /* USER CODE END WHILE */

    }

    /* USER CODE BEGIN 3 */

    /* USER CODE END 3 */
}


/* WDG init function */
static void ATC_WDG_Init(void)
{
    /* USER CODE BEGIN WDG_Init 0 */

    /* USER CODE END WDG_Init 0 */

    WDOG_ConfigType wdgConfig;
    memset(&wdgConfig, 0, sizeof(wdgConfig));

    /* USER CODE BEGIN WDG_Init 1 */

    /* USER CODE END WDG_Init 1 */
    MSP_WDG_Init(WDOG0);
    wdgConfig.timeout = 1874999;
    wdgConfig.control.updateEnable = DISABLE;
    wdgConfig.control.intEnable = DISABLE;
    wdgConfig.control.enableWDOG = ENABLE;
    wdgConfig.control.clkSource = WDG_CLOCK_APB;
    wdgConfig.control.prescaler = ENABLE;
    wdgConfig.control.winEnable = DISABLE;
    WDOG_Initialize(&wdgConfig);

    /* USER CODE BEGIN WDG_Init 2 */

    /* USER CODE END WDG_Init 2 */
}


/**
* WDOG_Feed
*
* @param[in]  none
* @return none
*
* @brief  the function to feed dog
*/
void WDOG_Feed(void)
{
    DisableInterrupts;
    WDOG0->CNT = 0x02A602A6;
    WDOG0->CNT = 0x80B480B4;
    EnableInterrupts;
}

使用特权

评论回复
沙发
单片小菜| | 2021-10-27 14:39 | 只看该作者
喂狗失败的断点停到了哪里?

使用特权

评论回复
板凳
1983万年青|  楼主 | 2021-10-28 14:23 | 只看该作者
本帖最后由 1983万年青 于 2021-10-28 15:29 编辑
单片小菜 发表于 2021-10-27 14:39
喂狗失败的断点停到了哪里?

找到是PWM1中断打开,无法退出导致的,  但是现在不知道为什么PWM1无法退出,我外部信号都没有接,设置的还是上升沿中断,还在研究什么原因导致;

PWM1输入捕获中断优先级3级; 另外PWM0输入捕获中断也是打开,
有个疑问,Autogen生成的 PWM输入捕获中断服务函数里面没有清除中断标志位的指令,同时回调函数也没有回调参数定义;

生成的RTC中断函数中有中断标志位清除指令,回调函数也有回调参数;

static void ATC_PWM1_Init(void)
{
    /* USER CODE BEGIN PWM1_Init 0 */

    /* USER CODE END PWM1_Init 0 */

    PWM_SetCallback(PWM1, PWM1_IRQHandler_Callback);

    /* USER CODE BEGIN PWM1_Init 1 */

    /* USER CODE END PWM1_Init 1 */
    MSP_PWM_Init(PWM1);
    PWM_InputCaptureInit(PWM1, PWM_CHANNEL_CHANNEL0, PWM_INPUTCAPTURE_RISINGEDGE);
    PWM_SetCapturePSCValue(PWM1, PWM_CHANNEL_CHANNEL0, 0);
    PWM_ClockSet(PWM1, PWM_CLOCK_SYSTEMCLOCK, 0);

    /* USER CODE BEGIN PWM1_Init 2 */

    /* USER CODE END PWM1_Init 2 */
}

void PWM1_IRQHandler_Callback(void)
{

    /* USER CODE BEGIN PWM1_IRQHandler_Callback*/

    /* USER CODE END PWM1_IRQHandler_Callback*/
}

/**
*
* @param[in] none.
*
* [url=home.php?mod=space&uid=266161]@return[/url] none.
*
* [url=home.php?mod=space&uid=247401]@brief[/url] PWM1_Isr interrupt service routine.
*/
void PWM1_IRQHandler(void)
{
    if (s_pwmCallback[1])
    {
        s_pwmCallback[1]();
    }
}

RTC中断函数
* BKP_IRQHandler
*
* @param[in]  none
* [url=home.php?mod=space&uid=266161]@return[/url] none
*
* [url=home.php?mod=space&uid=247401]@brief[/url]  override the BKP_IRQHandler
*/
void BKP_IRQHandler(void)
{
    if (g_BKPCallback[0])
    {
        g_BKPCallback[0](BKP_IsTIF(), BKP_IsTEF());
    }
    BKP_ClrTIF();
    BKP_ClrTEF();
}



使用特权

评论回复
地板
TechHolder| | 2021-11-11 09:57 | 只看该作者
1983万年青 发表于 2021-10-28 14:23
找到是PWM1中断打开,无法退出导致的,  但是现在不知道为什么PWM1无法退出,我外部信号都没有接,设置的 ...

所以是PWM1的中断标志位没有清除,导致不断的进入PWM1的中断?

使用特权

评论回复
5
sadicy| | 2021-11-11 11:22 | 只看该作者
标识位?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

21

帖子

1

粉丝