第一种方法:创建项目时只需要调用一个启动文件即可
看代码有注释
#if 0
#incclude<reg52.h>
sbit LED = P1^0;
void main(void )
{
P1 = 0XFE;//总线操作
LED = 0;//位操作
}
#end if
/*屏蔽程序中不需要的语句可以用#if 0
#else if 0 ...以#eng if结束多种情况*/
int main(void)
{ /*GPIO的地址为基地址加上指定的偏移地址
以PB0为例基地址为0x40010c00
CRL的偏移地址为0x00得到的实际地址为0X40010C00
强制数据转换为地址指针*(unsigned int*)
配置IO口PB0端口配置低寄存器 引脚0-7为低 配置CRL寄存器
引脚8-15为高 配置CRH寄存器设置对应自己所需的引脚位*/
//配置GPIOB端口的时钟打开
*(unsigned int*)0X40021018|= (1<<3);
//配置IO输出模式
*(unsigned int*)0X40010C00|= ((1)<<(4*0));/*CRL寄存器为4位操作所以是4*0右移配置4位设置输出方式为推挽输出,速度为50M*/
//配置ODR寄存器使PB0输出低电平
*(unsigned int*)0X40010C0C&=~(1<<0);//配置ODR寄存器使PB0输出低电平 ODR低16位有效
//置位 |= ,清零 &=~
//
}
第二种方法:是建立在第一种之上便于理解
对相关的寄存器地址进行定义放在stm32f10x.h库中进行直接调用见图
/*本文件用于添加寄存器地址及结构体定义*/
/*片上外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)
/*APB2 总线基地址 */
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
/* AHB总线基地址 */
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
/*GPIOC外设基地址*/
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
/* GPIOC寄存器地址,强制转换成指针 */
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)
/*RCC外设基地址*/
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
/*RCC的AHB1时钟使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
主函数
include "stm32f10x.h"
/**
* 主函数
*/
int main(void)
{
// 开启GPIOC 端口时钟
RCC_APB2ENR |= (1<<4);
//清空控制PC2的端口位
GPIOC_CRL &= ~( 0x0F<< (4*2));
// 配置PC2为通用推挽输出,速度为10M
GPIOC_CRL |= (1<<4*2);
// PC2 输出 低电平
GPIOC_ODR &= ~(1<<2);
while(1);
}
找基地址和偏移地址方法见图以GPIOB低位为例操作CRL相应的位可以控制输入输出模式以及速度