单片机的启动过程(从上电到main)

理解这篇文章之前,我们需要配合了解两个基础知识。

一个是加载视图和运行试图,一个是单片机的存储空间。

这篇文章会涉及两个新内容,而加载视图又涉及启动代码和Scatter文件。

所以通过集成环境讲解启动代码总显得力不从心。

这里我们从编译器和链接器开始讲起。

1、C语言的编译都是按照文件进行编译的,编译完成后,每一个.c文件会生成相应的.o文件,这个过程是编译器(ARMCC)做的。

2、因为各个.o的信息是分散的,函数变量都是们没有统一编址的,所以lds链接器需要将各个.o文件的信息汇总到一起,就是code+RO+RW的位置,这就形成了加载视图。

3、启动代码starts.s 做一些基础工作外,根据Scatter文件的信息 ,对RW进行搬移,搬移到RAM中,方便后期的访问。

4、搬移完成后,我们就可以访问全局变量了(这个时候全局变量都是在RAM里的,我们通过map文件看到的)

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     SVC_Handler               ; SVCall Handler
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     PendSV_Handler            ; PendSV Handler
                DCD     SysTick_Handler           ; SysTick Handler

Cortex-M0 以及M3 内核的 0地址保留,0x00000004地址用于存放复位向量。上电后,程序跳转到0x00000004地址运行,此地址存储的就是复位中断。

 

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  SystemInit
                IMPORT  __main
                LDR     R0, =SystemInit
                BLX     R0
                LDR     R0, =__main
                BX      R0
                ENDP

复位中断,先运行 系统初始化(SystemInit),然后跳转到__main过程。

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于TC264单片机的电机缓启动的示例C语言代码的一个简单实现: ```c #include <stdio.h> #include <stdint.h> // 定义电机最大速度和缓启动时间 #define MAX_SPEED 1000 #define RAMP_TIME 1000 // 定义电机启动状态 typedef enum { STOPPED, ACCELERATING, RUNNING, DECELERATING } MotorState; // 定义电机状态和速度变量 MotorState motorState = STOPPED; uint32_t motorSpeed = 0; // 定义延时函数 void delay(uint32_t milliseconds) { // 根据具体单片机的延时函数进行实现 } // 电机缓启动函数 void rampUpMotor() { if (motorState == STOPPED) { motorState = ACCELERATING; motorSpeed = 0; printf("Motor starting...\n"); } while (motorState == ACCELERATING) { // 加速阶段 motorSpeed += (MAX_SPEED / RAMP_TIME); // 控制电机速度,根据具体单片机和电机驱动器进行实现 // 设置电机速度,并等待一段时间,以模拟加速过程 printf("Motor speed: %d\n", motorSpeed); delay(10); // 延时10毫秒 if (motorSpeed >= MAX_SPEED) { motorState = RUNNING; printf("Motor running at max speed\n"); } } } // 主函数 int main() { // 初始化单片机和电机驱动器 // 模拟电机缓启动过程 rampUpMotor(); // 其他操作和控制逻辑 return 0; } ``` 请注意,这只是一个简单的示例代码,具体的实现可能需要根据你所使用的单片机和电机驱动器进行适配和调整。在实际应用中,你需要根据电机的具体参数和要求,结合单片机的GPIO控制和定时器功能,以及电机驱动器的通信协议进行相应的配置和控制,以实现电机缓启动的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值