STM32使用寄存器开发程序是如何执行的,
i.max6ull的汇编文件
.global __start
__start:
/*设置处理器进入svc模式下*/
mrs r0, cpsr /*读取cpsr到r0*/
bic r0, r0, #0x1f /*清除cpsr的bit4-0*/
orr r0, r0, #0x13 /*使用svc模式*/
msr cpsr, r0 /*将r0写入到cpsr*/
/*设置sp指针*/
ldr sp, =0x80200000
b main /*跳转到c语言mian函数*/
这时候就可以跳转到mian.函数里面执行了,像stm32一样直接操作就可以了,万事开头难,在第一个c语言点灯,可以做好一个模板,涉及到所有时钟地址,所有GPIO地址等等,这样也相当于自己构建了一个小库函数,废话不多说,开干。
1,时钟
这是所有外设的时钟,全找到写好,以后直接copy,
我们要找到这些时钟的地址,如下:
这是CCM_CCGR0的地址,就这样找到所有的,拿小本本记下来,
所有的时钟寄存器地址
#define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)
#define CCM_CCGR2 *((volatile unsigned int *)0X020C4070)
#define CCM_CCGR3 *((volatile unsigned int *)0X020C4074)
#define CCM_CCGR4 *((volatile unsigned int *)0X020C4078)
#define CCM_CCGR5 *((volatile unsigned int *)0X020C407C)
#define CCM_CCGR6 *((volatile unsigned int *)0X020C4080)
2,IO复用
接下来找到这十组io的地址
#define SW_MUX_GPIO1_IO00 *((volatile unsigned int *)0X020E005C)
#define SW_MUX_GPIO1_IO01 *((volatile unsigned int *)0X020E0060)
#define SW_MUX_GPIO1_IO02 *((volatile unsigned int *)0X020E0064)
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_MUX_GPIO1_IO04 *((volatile unsigned int *)0X020E006C)
#define SW_MUX_GPIO1_IO05 *((volatile unsigned int *)0X020E0070)
#define SW_MUX_GPIO1_IO06 *((volatile unsigned int *)0X020E0074)
#define SW_MUX_GPIO1_IO07 *((volatile unsigned int *)0X020E0078)
#define SW_MUX_GPIO1_IO08 *((volatile unsigned int *)0X020E007C)
#define SW_MUX_GPIO1_IO09 *((volatile unsigned int *)0X020E0080)
3,电气属性
电气属性这里就要根据情况配置了
SER ------------- bit0--------------------------压摆率(io电平跳变所需时间,0跳变慢,1跳变快)
DSE ------------- bit5-3-----------------------io驱动能力(八个选项000-111驱动能力依次增大)
SPEED---------- bit7-6-----------------------输出速率(50,100,100,200四个选项–》00,01,10,11)
ODE---------------bit11------------------------开路输出(0禁止,1使能)
PkE----------------bit12------------------------状态保持器/上下拉(仅输入有效)0,禁止 1使能
PUE---------------bit13------------------------设置保持器/上下拉(仅输入有效)0不使用1使用
PUS---------------bit14-15--------------------设置上下拉电阻大小(100k下,47k上,100k上,22k上—》00 01 10 11)
HYS---------------bit16-------------------------迟滞比较器(仅输入有效)输入波形整形 使能1
上述其它位保留
这是点灯所配置的
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
4,io功能
#define GPIO1_DR *((volatile unsigned int *)0X0209C000)
#define GPIO1_GDIR *((volatile unsigned int *)0X0209C004)
#define GPIO1_PSR *((volatile unsigned int *)0X0209C008)
#define GPIO1_ICR1 *((volatile unsigned int *)0X0209C00C)
#define GPIO1_ICR2 *((volatile unsigned int *)0X0209C010)
#define GPIO1_IMR *((volatile unsigned int *)0X0209C014)
#define GPIO1_ISR *((volatile unsigned int *)0X0209C018)
#define GPIO1_EDGE_SEL *((volatile unsigned int *)0X0209C01C)
构建如下
led.c
#include "led.h"
void led_init(void)
{
CCM_CCGR1 = 0xffffffff;/*配置时钟*/
SW_MUX_GPIO1_IO03 = 0x05; /*io复用*/
SW_PAD_GPIO1_IO03 = 0X10B0; /*电气属性*/
GPIO1_GDIR = 0X0000008; /* GPIO, GPIO1_IO03 设置为输出 */
LED0_OFF;/*默认关闭LED*/
}
/*函数功能:控制LED状态*/
void LED(int state)
{
if(state==1) LED0_ON;
if(state==0) LED0_OFF;
}
led.h
#ifndef __led_h
#define __led_h
/*定义要使用的寄存器*/
/*时钟-----------------手册698-707*/
#define CCM_CCGR0 *((volatile unsigned long*)0x020c4068) /*直接读写寄存器*/
#define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)
#define CCM_CCGR2 *((volatile unsigned int *)0X020C4070)
#define CCM_CCGR3 *((volatile unsigned int *)0X020C4074)
#define CCM_CCGR4 *((volatile unsigned int *)0X020C4078)
#define CCM_CCGR5 *((volatile unsigned int *)0X020C407C)
#define CCM_CCGR6 *((volatile unsigned int *)0X020C4080)
/*io复用---------------手册1568-1577*/
#define SW_MUX_GPIO1_IO00 *((volatile unsigned int *)0X020E005C)
#define SW_MUX_GPIO1_IO01 *((volatile unsigned int *)0X020E0060)
#define SW_MUX_GPIO1_IO02 *((volatile unsigned int *)0X020E0064)
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_MUX_GPIO1_IO04 *((volatile unsigned int *)0X020E006C)
#define SW_MUX_GPIO1_IO05 *((volatile unsigned int *)0X020E0070)
#define SW_MUX_GPIO1_IO06 *((volatile unsigned int *)0X020E0074)
#define SW_MUX_GPIO1_IO07 *((volatile unsigned int *)0X020E0078)
#define SW_MUX_GPIO1_IO08 *((volatile unsigned int *)0X020E007C)
#define SW_MUX_GPIO1_IO09 *((volatile unsigned int *)0X020E0080)
/*电气属性--------------手册1789-1805*/
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4) /*16位寄存器*/
/*
*bit 16:0 HYS 关闭
*bit [15:14]: 00 默认下拉
*bit [13]: 0 kepper 功能
*bit [12]: 1 pull/keeper 使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度 100Mhz
*bit [5:3]: 110 R0/6 驱动能力
*bit [0]: 0 低转换率
*/
/*io功能---------------手册1358-1369*/
#define GPIO1_DR *((volatile unsigned int *)0X0209C000) /*DR----------数据寄存器*/
#define GPIO1_GDIR *((volatile unsigned int *)0X0209C004) /*GDIR--------方向寄存器*/
#define GPIO1_PSR *((volatile unsigned int *)0X0209C008) /*PSR---------GPIO状态寄存器*/
#define GPIO1_ICR1 *((volatile unsigned int *)0X0209C00C) /*ICR1--------低16位中断控制寄存器*/
#define GPIO1_ICR2 *((volatile unsigned int *)0X0209C010) /*ICR2--------高十六位中断控制寄存器*/
#define GPIO1_IMR *((volatile unsigned int *)0X0209C014) /*IMR---------中断屏蔽寄存器*/
#define GPIO1_ISR *((volatile unsigned int *)0X0209C018) /*ISR---------中断状态寄存器*/
#define GPIO1_EDGE_SEL *((volatile unsigned int *)0X0209C01C) /*EDGE_SEL----边沿选择寄存器*/
#define LED0_ON GPIO1_DR &= ~(1<<3);
#define LED0_OFF GPIO1_DR |= (1<<3);
void led_init(void);
void LED(int state);
#endif /*__led_h*/
自己做了一个模板工程
板级支持包和应用分开构建,有利于后期做驱动移植
点击下载link
提取码:0117