0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何实现stm32单片机每次接上电源就进行一次重启动?

工程师邓生 来源:未知 作者:刘芹 2023-09-14 14:22 次阅读

如何实现stm32单片机每次接上电源就进行一次重启动?

嵌入式系统中,单片机的重启有时是十分必要的,它可以解决一些系统启动过程中的问题、恢复系统的正常运行、使系统更加稳定等。

然而,有时候我们需要每次接上电源就进行一次重启,也就是实现系统的自动重启。本文将给出一个思路,来实现stm32单片机每次接上电源就进行一次重启动。

一、背景知识

嵌入式系统中,有两类重启,分别是软重启和硬重启。

1.1 软重启

软重启是指通过程序控制单片机重新开始执行,实现系统的重启。在stm32单片机中,一般采用如下代码进行软重启:

```c
NVIC_SystemReset(); //调用此函数进行软重启
```

1.2 硬重启

硬重启是指通过硬件控制单片机重新开始执行,实现系统的重启。在stm32单片机中,硬重启通常是通过复位按键进行操作的。复位按键的功能是将单片机的复位引脚拉低,在一定时间后再拉高,从而实现单片机的重启。

二、实现思路

了解了软重启和硬重启之后,我们来思考如何实现stm32单片机每次接上电源就进行一次重启动。下面是一种实现思路:

2.1 硬重启

由于我们需要每次接上电源就进行一次重启,所以需要采用硬重启的方式。同时,我们还需要在重启之前有一个短暂的延时,以确保系统已经稳定运行。

在stm32单片机中,硬重启通常是通过复位按键进行操作的。我们可以在单片机的复位引脚和复位按键之间串联一个带有一定延时的电容,使得单片机在接电源,电容充电过程中,复位引脚的电平保持低电平,从而实现单片机的重启。

2.2 延时

在实际应用中,需要根据系统的不同运行环境和实际需求来设置延时的时间。由于系统重启时,CPU还没有开始执行代码,也就是没有时钟信号产生,所以我们需要在复位电容电压升高之前就将系统时钟启动,以保证系统能够稳定运行。在stm32单片机中,我们可以通过设置RCC_CR寄存器中的HSEON位或HSION位来启动时钟。

三、代码实现

实现思路已经确定,下面给出相应的代码实现。

3.1 延时函数

为了实现正确的延时,我们需要在代码中实现一个延时函数。下面是一种简单的延时函数实现:

```c
void delay(uint32_t n) {
while(n--) {
asm("nop");
}
}
```

3.2 硬重启

在stm32单片机中,复位引脚的引脚号为NRST,一般被定义为GPIOA的第0号引脚(PA0)。同时,我们还需要在复位引脚和复位按键之间串联一个带有一定延时的电容。

```c
void Reset_System(void) {
//延时一段时间
delay(0xFFFFF);
//启动时钟
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON); //启动外部高速晶振
RCC_WaitForHSEStartUp(); //等待外部高速晶振就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); //将外部高速晶振选为系统时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择AHB时钟为HCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //选择APB2时钟为HCLK
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//复位引脚配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//将NRST引脚拉低一段时间,模拟复位按键的按下操作
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
delay(0x3FF);
//将NRST引脚拉高,完成重启操作
GPIO_SetBits(GPIOA, GPIO_Pin_0);
}
```

3.3 主函数

在主函数中,我们对函数进行调用即可。

```c
int main(void) {
Reset_System();
//其他代码
}
```

四、总结

本文介绍了实现stm32单片机每次接上电源就进行一次重启动的思路,并给出相应的代码实现。

在实际应用中,我们可以根据系统的不同运行环境和实际需求,来设置延时的时间和复位电容的大小。同时,我们还可以采用软重启的方式来满足不同的需求。

最后,需要注意的是,重启操作可能会对系统的稳定性产生影响,应根据实际需求来考虑是否需要进行系统的重启。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5029

    浏览量

    117733
  • 嵌入式系统
    +关注

    关注

    40

    文章

    3430

    浏览量

    128221
  • RCC
    RCC
    +关注

    关注

    0

    文章

    91

    浏览量

    26705
  • GPIO
    +关注

    关注

    16

    文章

    1133

    浏览量

    50573
  • STM32单片机
    +关注

    关注

    58

    文章

    545

    浏览量

    57934
收藏 人收藏

    评论

    相关推荐

    AVR单片机外接16M晶振和STM32F103外接8MHZ运行速度哪个更快?

    同样的程序进行比较: AVR单片机外接16M晶振:运行程序是矩阵按键扫描采用定时器中断100ms扫描一次、还有串口接收中断程序1S接收一次运行程序上后,串口接收中断程序不会影响矩阵按键
    发表于 04-23 07:43

    STM32L151RCT6单片机下载完程序不断电重启进不了低功耗怎么解决?

    最近遇到个很奇怪的问题,使用的是stm32L151RCT6单片机,固件库用的是STM32Cube_FW_L1_V1.8.1,程序中有低功耗的部分,当我下载完程序然后将设备彻底断电
    发表于 04-12 07:07

    STM32F205利用DMA实现多通道ADC采样,但是每启动一次转换才能更新一次结果是为什么?

    mode; 3、软件SWSTART启动AD转换后,每启动一次内存中只有一次转换结果更新,要完成12采样需要SWSTART
    发表于 03-27 06:37

    使用FPGA对AD7606进行采样,每次采样的值总是再下一次采样时出现是什么问题?

    你好,这是原理图 我使用FPGA对AD7606进行采样,每次采样的值总是再下一次采样时出现,请问这是什么问题?
    发表于 12-14 08:06

    请问单片机的main函数是执行一次还是会反复执行?

    段时间 motor = 0;//电机停 } 按程序逻辑,电机应该是运行会就停止的,但是下载到板子之后,电机直运行。 在程序最后加了while死循环之后,电机才运行会之后停止。 请问,单片
    发表于 10-23 06:20

    请问单片机的main函数是执行一次还是会反复执行?

    请问单片机的main函数是执行一次,还是会反复执行?
    发表于 10-19 06:25

    51单片机电路第一次上电无法下载程序

    使用stc15W204s单片机,第一次上电时复位键无法工作,不能下载程序,已下载过程序的单片机焊接在这个电路上可正常下载。
    发表于 10-08 14:12

    电脑不启动,机箱电源灯和风扇反复亮几秒,停几秒,偶尔又能进系统正常运行一次。是主板上什么元件故障?

    排除法确认是华擎X99m killer主板有故障,表现为经常不能成功开机,黑屏无显示信号输出,机箱电源灯反复亮3、5秒,灭3、5秒,cpu风扇也同样反复转转停停,主板上故障跑码表无显示。偶尔会第一次
    发表于 09-25 21:37

    款漂亮的板子 #单片机 #FreeRTOS #stm32 #stm32单片机

    单片机STM32
    百问网官方
    发布于 :2023年09月20日 15:26:00

    LNK304DN接led灯存在单片机重启现象是怎么回事?

    继电器的输出端为空时,打开关闭继电器,切正常,当继电器接上LED时,打开关闭继电器时导致了12V输出出现很大的纹波,严重时导致了单片机重启。求大神指点
    发表于 08-01 15:25

    CPU低温重启问题的定位和解决

    某产品研发阶段在做四角实验的过程中,发现单板在低温下出现反复重启动的问题,经过反复的实验和定位,发现是核电源DC-DC芯片使用的液态电解电容,在低温下,内部液体固化。导致电容ESR降低,进而使DC-DC输出的纹波变大,出现单板反复重启动
    发表于 06-25 16:57 797次阅读
    CPU低温<b class='flag-5'>重启</b>问题的定位和解决

    GPRS联网时或联网成功后收发数据的数据,单片机复位重启怎么解决?

    应用场景 GPRS模块采用AIR202/AIR208,电源方案是JW5033; 单片机采用新唐N76E003,双串口,18K flash,电源与GPRS的DCDC 即JW5033共用
    发表于 06-15 07:27

    浅析STM32单片机启动文件

    今天来总结的stm32基础知识是启动文件相关。要想对是stm32单片机有个深入的理解,那么启动文件就是一个绕不过去的坎。
    发表于 06-12 16:49 980次阅读
    浅析<b class='flag-5'>STM32</b><b class='flag-5'>单片机</b>的<b class='flag-5'>启动</b>文件

    linux系统异常重启,如何获取最后一次启动日志并分析异常?

    亲爱的 NXP IMX8 支持团队。 linux系统异常重启,如何获取最后一次启动日志并分析异常?
    发表于 06-08 07:21

    如何知道单片机重启的原因?

    我们正在使用 MK221M 控制器。 实时操作系统 MQX4.2 我需要知道每次重启时微控制器的重启原因。 示例:由于看门狗、电源循环等原因,微控制器可能会重新
    发表于 05-19 09:13