| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-07-28 | gingko | 初次建立 | \\ \\ \\ ===== STM32CubeMX教程二十六——IWDG看门狗实验 ===== 1.在主界面选择File-->New Project 或者直接点击ACCEE TO MCU SELECTOR {{ :icore4tx:icore4tx_cube_26_1.png?direct |}} 2.出现芯片型号选择,x搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 {{ :icore4tx:icore4tx_cube_26_2.png?direct |}} 3.配置RCC,使用外部时钟源 {{ :icore4tx:icore4tx_cube_26_3.png?direct |}} 4.时基源选择SysTick {{ :icore4tx:icore4tx_cube_26_4.png?direct |}} 5.将PA10,PB7,PB8设置为GPIO_Output {{ :icore4tx:icore4tx_cube_26_5.png?direct |}} 6.将ARM_KEY对应的引脚PH7设置为GPIO_Intput {{ :icore4tx:icore4tx_cube_26_6.png?direct |}} 7.引脚模式配置 {{ :icore4tx:icore4tx_cube_26_7.png?direct |}} {{ :icore4tx:icore4tx_cube_26_8.png?direct |}} 8.配置IWDG {{ :icore4tx:icore4tx_cube_26_9.png?direct |}} 9.时钟源设置,选择外部高速时钟源,配置为最大主频 {{ :icore4t:icore4t_cube_26_10.png?direct |}} 10.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27 {{ :icore4tx:icore4tx_cube_26_11.png?direct |}} 11.点击Code Generator,进行进一步配置 {{ :icore4tx:icore4tx_cube_26_12.png?direct |}} * **Copy all used libraries into the project folder** * 将HAL库的所有.C和.H都复制到所建工程中 * 优点:这样如果后续需要新增其他外设又可能不再用STM32CubeMX的时候便会很方便 * 缺点:体积大,编译时间很长 * **Copy only the necessary library files** * 只复制所需要的.C和.H(推荐) * 优点:体积相对小,编译时间短,并且工程可复制拷贝 * 缺点:新增外设时需要重新用STM32CubeMX导入 * **Add necessary library files as reference in the toolchain project configuration file** * 不复制文件,直接从软件包存放位置导入.C和.H * 优点:体积小,比较节约硬盘空间 * 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径 * 自行选择方式即可 12.然后点击GENERATE CODE 创建工程 {{ :icore4tx:icore4tx_cube_26_13.png?direct |}} 创建成功,打开工程。 \\ \\ \\ ===== 实验二十六:IWDG看门狗实验——复位ARM ===== ==== 一、 实验目的与意义 ==== - 了解STM32 IWDG结构。 - 了解STM32 IWDG特征。 - 掌握IWDG的使用方法。 - 掌握STM32 HAL库中IWDG属性的配置方法。 - 掌握KEILMDK 集成开发环境使用方法。 ==== 二、 实验设备及平台 ==== - iCore4T 双核心板。[[https://item.taobao.com/item.htm?spm=a1z10.1-c.w137644-251734891.3.5923532fDrMDOe&id=610595120319|点击购买]] - JLINK(或相同功能)仿真器。[[https://item.taobao.com/item.htm?id=554869837940|点击购买]] - Micro USB线缆。 - Keil MDK 开发平台。 - STM32CubeMX开发平台。 - 装有WIN XP(及更高版本)系统的计算机。 ==== 三、 实验原理 ==== === 1.看门狗简介 === * 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误,不在程序区,取出错误的程序指令等,都会陷入死循环。程序的正常运行被打断,由单片机控制的系统无法继续正常工作,会造成整个系统陷入停滞状态,发生不可预料的后果。看门狗就是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启的电路。看门狗命令在程序的中断中拥有最高的优先级。 === 2.STM32H7独立看门狗简介 === * STM32H750的独立看门狗由内部专门的32Khz低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而是在17~47Khz之间的一个可变化的时钟,只是我们在估算的时候,以32Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。 === 3.相关寄存器 === == (1) 键值寄存器 IWDG_KR == * **该寄存器的各位描述如图:** {{ :icore4tx:icore4tx_arm_hal_26_1.png?direct |}} * 在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器IWDG_KR中被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。 * IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。 == (2) 预分频寄存器(IWDG_PR) == * 该寄存器用来设置看门狗时钟的分频系数,最低为4,最高位256,该寄存器是一个32位的寄存器,但是我们只用了最低3位,其他都是保留位。预分频寄存器各位定义如图: {{ :icore4t:icore4t_arm_hal_26_2.png?direct |}} == (3) 重装载寄存器(IWDG_RLR) == * 该寄存器用来保存重装载到计数器中的值。该寄存器也是一个32位寄存器,但是只有低12位是有效的,该寄存器的各位描述如图: {{ :icore4tx:icore4tx_arm_hal_26_3.png?direct |}} * 只要对以上三个寄存器进行相应的设置,我们就可以启动STM32H7的独立看门狗。 ==== 四、 实验程序 ==== === 1.主函数 === int main(void) { HAL_Init(); SystemClock_Config(); i2c.initialize(); axp152.initialize(); axp152.set_dcdc1(3500);//[ARM & FPGA] axp152.set_dcdc2(1200);//[FPGA INT] axp152.set_dcdc3(3300);//[DCOUT3] axp152.set_dcdc4(3300);//[DCOUT4] axp152.set_aldo1(3300);//[BK3] axp152.set_aldo2(3300);//[ALDOOUT2] axp152.set_dldo1(3300);//[BK0] axp152.set_dldo2(3300);//[BK1] MX_GPIO_Init(); MX_IWDG1_Init(); HAL_Delay(50); LED_ON; while (1) { /* 独立看门狗设置“喂狗”时间为2s,如果超过2s没有“喂狗”,则“被狗咬”,立即STM32复位 */ while(ARM_KEY_VALUE == KEY_DOWN);//按键按下不再喂狗,STM32将复位 HAL_IWDG_Refresh(&hiwdg1); //每1s喂狗一次,防止被狗咬 LED_ON; HAL_Delay(500); LED_OFF; HAL_Delay(500); } } === 2.IWDG1初始化函数 === void MX_IWDG1_Init(void) { hiwdg1.Instance = IWDG1; hiwdg1.Init.Prescaler = IWDG_PRESCALER_32; //预分频系数 hiwdg1.Init.Window = 4095; //窗口值 hiwdg1.Init.Reload = 2000; //重装载值 if (HAL_IWDG_Init(&hiwdg1) != HAL_OK) { Error_Handler(); } } === 3.喂狗函数 === * 在HAL中重载计数值的函数是HAL_IWDG_Refresh,它的作用是把值0xAAAA写入到IWDG_KR寄存器,从而触发计数器重载,即实现独立看门狗的喂狗操作。该函数声明为: HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg) { /* 使用重载寄存器中定义的值重载IWDG计数器 */ __HAL_IWDG_RELOAD_COUNTER(hiwdg); /* 返回函数状态 */ return HAL_OK; } ==== 五、 实验步骤 ==== - 把仿真器与iCore4TX的SWD调试口相连(直接相连或者通过转接器相连); - 把iCore4TX通过Micro USB线与计算机相连,为iCore4TX供电; - 打开Keil MDK 开发环境,并打开本实验工程; - 烧写程序到iCore4TX上; - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 ==== 六、 实验现象 ==== iCore4TX双核心板LED闪烁,当按键按下超过2s,看门狗复位ARM,LED熄灭。