作者共发了4篇帖子。 内容转换:不转换▼
 
点击 回复
623 3
【程序】独立看门狗IWDG的使用
一派护法 十九级
1楼 发表于:2017-3-24 18:18
#include <stm32f10x.h>

uint8_t seg8[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
uint16_t num = 0;

void delay(void)
{
    uint16_t i;
    for (i = 0; i < 20000; i++);
}

void ser_in(uint8_t data)
{
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
        GPIOB->BRR = GPIO_BRR_BR9; // SCLK=PB9
        if (data & 0x80)
            GPIOB->BSRR = GPIO_BSRR_BS7; // DIO=PB7
        else
            GPIOB->BRR = GPIO_BRR_BR7;
        data <<= 1;
        GPIOB->BSRR = GPIO_BSRR_BS9;
    }
}

void par_out(void)
{
    GPIOB->BRR = GPIO_BRR_BR8; // RCLK=PB8
    GPIOB->BSRR = GPIO_BSRR_BS8;
}

void seg_scan(void)
{
    uint8_t i;
    uint16_t numbuf = num;
    for (i = 0; i <= 4; i++)
    {
        ser_in(seg8[numbuf % 10]);
        ser_in(1 << i);
        par_out();
        delay();
        numbuf /= 10;
    }
}

int main(void)
{
    uint8_t i;
    RCC->APB1ENR = RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
    PWR->CR |= PWR_CR_DBP; // 允许写入后备寄存器
    
    // 上电复位: PORRSTF=PINRSTF=1
    // 复位键复位: PINRSTF=1
    if (RCC->CSR & RCC_CSR_PORRSTF)
        num = 1970; // 通电时写入初值
    else
        num = BKP->DR1; // 复位时读取寄存器值
    if (RCC->CSR & RCC_CSR_PINRSTF)
        BKP->DR1 = num + 1; // 每次复位都把寄存器的值加1
    if (RCC->CSR & RCC_CSR_IWDGRSTF)
        BKP->DR1 = num - 1; // 如果是看门狗复位则减去1
    RCC->CSR |= RCC_CSR_RMVF; // 清除复位标志信息
    
    /* 配置GPIO口*/
    RCC->APB2ENR = RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
    GPIOB->CRL = 0x30000000;
    GPIOB->CRH = 0x00000033;
    GPIOC->CRL = 0x00000080; // PC1设为带电阻输入
    GPIOC->BSRR = GPIO_BSRR_BS1; // PC1带上拉电阻输入
    
    IWDG->KR = 0x5555; // 开始配置
    IWDG->PR = 3; // 32分频, f=40kHz/32=1250Hz->0.8ms
    IWDG->RLR = 1250; // 定时时间: 1250*0.8ms=1s, 1250=0x4e2
    // 写入后不需要等待PVU, RVU标志位清零
    IWDG->KR = 0xcccc; // 启动看门狗
    IWDG->KR = 0xaaaa; // 导入上述配置
    
    while (1)
    {
        for (i = 0; i < 20; i++)
            seg_scan();
        if ((GPIOC->IDR & GPIO_IDR_IDR1) == 0)
            IWDG->KR = 0xaaaa; // 如果PC1键按住不放(低电平), 则喂狗
    }
}
一派护法 十九级
2楼 发表于:2017-3-24 19:11
if (GPIOC->IDR & GPIO_IDR_IDR1)
    IWDG->KR = 0xaaaa; // 如果PC1键按住不放(低电平), 则不喂狗
一派护法 十九级
3楼 发表于:2017-3-24 19:18
     时刻                 显示的数字  存储的数字
刚通电时                  1970            1971
IWDG Reset 1        1971            1970
IWDG Reset 2        1970            1969
IWDG Reset 3        1969            1968
IWDG Reset 4        1968            1967
......
一派护法 十九级
4楼 发表于:2017-3-24 22:16
这里要注意的是,一旦启动了独立看门狗就无法再停止,即便是KR寄存器写0x5555进入设置状态也没用。

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:623 回复数:3
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2017-3-24 22:16
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。