前言
stm32f103c8t6最小核心学习板包含了以下成分:
1.四方扁平封装的主要MCU – STM32F103C8T6。
2.重置开关–重置微控制器。
3.microUSB端口–用于串行通信和电源。
4.BOOT选择器跳线– BOOT0和BOOT1跳线,用于选择引导存储器。
5.两个LED –用户LED和电源LED。
6.8 MHz晶振– MCU的主时钟。
7.32.768KHz振荡器– RTC时钟。
8.SWD接口–用于使用ST-Link进行编程和调试。
9.3.3V稳压器(在底部)–将5V转换为3.3V,以为MCU供电。
提示:以下是本篇文章正文内容,下面案例可供参考
一,寄存器配置
1,时钟控制
时钟控制名字叫做RCC,属于AHB总线。
我们可以在6.3.7小节找到APB2外设时钟使能寄存器(RCC_APB2ENR),偏移地址是0x18,所以APB2的地址就是0x4002 1018。 首先对RCC寄存器定义
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
根据上图可知,想要使GPIOX端口时钟使能,就可以把RCC_APB2ENR的位X赋值为1,就可以开启该端口的时钟。
RCC_APB2ENR |= (1<<3); //GPIOB端口时钟使能
RCC_APB2ENR |= (1<<4); //GPIOC端口时钟使能
RCC_APB2ENR |= (1<<2); //GPIOA端口时钟使能
2,GPIO端口设置:
总所周知,stm32每一组GPIO端口都配置有7种寄存器
1.端口配置低寄存器GPIOx_CRL 2.端口配置高寄存器(GPIOx_CRH) 3.端口输入数据寄存器(GPIOx_IDR) 4.端口输出数据寄存器(GPIOx_ODR) 5.端口位设置/ 清除寄存器(GPIOx_BSRR) 6.端口位清除寄存器(GPIOx_BRR) 7.端口配置锁定寄存器(GPIOx_LCKR)
STM32中,用端口配置低寄存器(GPIOx_CRL)来配置引脚Px0-Px7, 用端口配置高寄存(GPIOx_CRH)来配置引脚Px8-Px15。
我在实验中使用了A0,B9,C14三个串行口,定义的寄存器分别是
偏移地址是0x04,意思是在基地址的基础上再加0x04,所以,对于GPIOB来说就是0x4001 0c04。如果配置PB0-PB7,那么需要的寄存器是低位的寄存器GPIOB_CRL,它的地址是0x4001 0c00。
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ORD *((unsigned volatile int*)0x40010C0C)
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ORD *((unsigned volatile int*)0x4001100C)
其中GPIO_ORD寄存器的第一位设置为0则代表串行口输出低电平,ODR的第2位设置为1则代表P2口输出高电平。 已知点亮LED灯需要输出低电平,
GPIOA_ORD=0x0<<0; //PA0亮
Delay_ms(5000000); //设置时延
GPIOA_ORD=0x1<<0; //PA0灭
Delay_ms(5000000);
GPIOB_ORD=0x0<<9; //PB9亮
Delay_ms(5000000);
GPIOB_ORD=0x1<<9; //PB9灭
Delay_ms(5000000);
GPIOC_ORD=0x0<<15; //PC15亮
Delay_ms(5000000);
GPIOC_ORD=0x1<<15; //PC15灭
Delay_ms(5000000);
其中Delay_ms()是设置的时延函数,具体多少时间没有计算,跟着感觉来的。
再就是输出的选择
我们在这里使用的是推免输出。
二、实际操作
1.具体代码
#define GPIOB_BASE 0x40010C00BSRR:
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ORD *((unsigned volatile int*)0x40010C0C)
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ORD *((unsigned volatile int*)0x4001100C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
int main(){
RCC_APB2ENR |= (1<<3);
RCC_APB2ENR |= (1<<4);
RCC_APB2ENR |= (1<<2);
GPIOA_CRL&=0xFFFFFFF0;
GPIOA_CRL|=0x00000002;
GPIOA_ORD|=1<<0;
GPIOB_CRH&=0xFFFFFF0F;
GPIOB_CRH|=0x00000020;
GPIOB_ORD|=1<<9;
GPIOC_CRH&=0xF0FFFFFF;
GPIOC_CRH|=0x03000000;
GPIOC_ORD|=0x1<<14;
while(1)
{
GPIOA_ORD=0x0<<0;
Delay_ms(5000000);
GPIOA_ORD=0x1<<0;
Delay_ms(5000000);
GPIOB_ORD=0x0<<9;
Delay_ms(5000000);
GPIOB_ORD=0x1<<9;
Delay_ms(5000000);
GPIOC_ORD=0x0<<14;
Delay_ms(5000000);
GPIOC_ORD=0x1<<14;
Delay_ms(5000000);
}
}
2.keil5项目运行
1.新建项目名字为stm 2.芯片选择stm32f103c8
4. 5.运行
没有错误
3.硬件的连接
固定连接:
USB接口 | STM32最小系统板 |
---|
GND | GND | 3V3 | 3V3 | RXD | A9 | TXD | A10 |
其余连接: 如图所示
4.链接到 mcuisp 串口链接软件上
将硬件的usb接口链接到电脑上,然后点击 开始编程
5,LED灯闪烁
总结
这次实验对我们的学习是一次很大的历练,学到了更多 的stm的知识,也增加了动手能力,虽然遇到了挺多困难的,但是还是有很多的收获。
参考文献
https://blog.csdn.net/qq_43445076/article/details/88896383 https://blog.csdn.net/geek_monkey/article/details/86291377 https://blog.csdn.net/geek_monkey/article/details/86293880
|