STM32使用寄存器开发程序是如何执行的,  
i.max6ull的汇编文件
.global __start
__start:
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0x13
msr cpsr, r0
ldr sp, =0x80200000
b main
这时候就可以跳转到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;
SW_PAD_GPIO1_IO03 = 0X10B0;
GPIO1_GDIR = 0X0000008;
LED0_OFF;
}
void LED(int state)
{
if(state==1) LED0_ON;
if(state==0) LED0_OFF;
}
led.h
#ifndef __led_h
#define __led_h
#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)
#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)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
#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)
#define LED0_ON GPIO1_DR &= ~(1<<3);
#define LED0_OFF GPIO1_DR |= (1<<3);
void led_init(void);
void LED(int state);
#endif
自己做了一个模板工程 
板级支持包和应用分开构建,有利于后期做驱动移植
点击下载link
提取码:0117
|