1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
前期准备
1、STM32F103(我用的是普中的Z200板) 2、IDE Keil5(MDK-ARM)软件 3、STM32固件库、STM32数据手册、STM32中文参考手册、开发板原理图(参考自己的开发板) keil软件的安装网上有很多,这里我就不过多介绍了。 一、新建工程 1、打开keil5,点击左上方Project,选择New uVision Project,文件自己命名,点击保存,我这里是已建好的文件。 2、选择自己的芯片型号,这里我的是STM32F103ZE,点击OK。 如果没有需要自己在软件中或者在官网上下载,这里不过多介绍3、点击Cancel退出 4、添加起动文件 启动文件是 startup_stm32f10x_hd.s 这个文件,在我网盘文件:STM32最新固件库v3.5LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm 这个路径下。 选择复制并粘贴到自己所创的文件下。 右键左侧文件目录选择第3个选项,找到启动文件并添加,文件类型选择All files。 4、新建main.c文件 右键左侧文件目录选择第2个选项,选择C文件并命名为main.c,点击Add。 到这里文件建立结束 二、寄存器讲解 1、什么是寄存器映射 存储器本身不具有地址信息,它的地址是由芯片厂商或 用户分配,给存储器分配地址的过程称为存储器映射,如果 再分配一个地址就叫重映射。 stm32f103芯片总共有4个G的内存,内存被分为了8块,每块具有512M的内存,分别被分配了自己的功能地址。
2、寄存器的程序控制 要使用特定的功能需要用 “*” 取出相应功能地址中的值,然后进行位操作,例如: *(unsigned int *)0x40021018 |=(1<<3); 由于STM32是32位处理机,因此在地址中取出的值是32位,后面会继续讲到。 三、使用寄存器配置引脚 1、STM32引脚的说明 stm32引脚与51单片机的引脚不同的地方是,51单片机可以直接控制输入输出,而32单片机需要打开对应的引脚时钟,配置输入和输出模式,再配置引脚的电平。因此STM32引脚寄存器的配置步骤为: (1)打开GPIO引脚时钟 (2)配置输入和输出模式 (3)配置电平 对于本开发板的引脚,分为A、B、C、D、E、F、G类,每类最多16个引脚,为什么是16个一会儿说。 2、LED原理图 这里请参考自己开发板的原理图 我们选择LED1进行配置,当LED1的引脚为低电平时,电流流通发光二级管,小灯点亮,反过来一样。 3、LED1引脚配置 (1)B类引脚时钟使能配置 引脚时钟地址RCC的范围
APB2外设时钟使能地址=基地址+偏移地址基地址是RCC的范围首地址0x4002 1000,偏移地址是0x18。 因此RCC地址=0x4002 1000+0x0000 0018 = 0x4002 1018 上图是指针地址取出的数据,可以看出是32位,每位对应不同功能的时钟,我们需要B类引脚的时钟,在第三位,让这个位为1就可以使能B类引脚的时钟了。因此操控程序为: *(unsigned int *)0x40021018 |=(1<<3); (2)PB5引脚(B类第5引脚)功能配置 图片在发布文件的STM32中文参考手册第28页从上图这里可以知道B类引脚的首地址(基地址)是0x4001 0C00 为什么引脚寄存器会有低寄存器和高寄存器之分呢? 原因是地址取出的数据是32位,每4位为一组代表一个引脚,其中低两位为输入输出模式配置 另外高两位为引脚输入模式的上下拉配置 因此低端寄存器配置0-7引脚,高端寄存器配置8-15引脚,总共16个引脚,这就是为什么每类引脚只能有16个。 PB5引脚在低端寄存器配置。 低端寄存器地址=B类引脚基地址+偏移地址=0x4001 0C00 + 0x00=0x4001 0C00 控制程序为: *(unsigned int *)0x40010C00 &=~(0x0F<<(4*5)); //先清零 *(unsigned int *)0x40010C00 |=(1<<(4*5)); //在置位 (3)配置PB5引脚(B类第5引脚)输出低电平
由上图可以看出,取出数据的第5位是PB5,让这个为置0就可以让PB5引脚输出低电平。 端口输出寄存器地址=B类引脚基地址+偏移地址=0x4001 0C00+0x0C=0x4001 0C0C 控制程序为: *(unsigned int *)0x40010C0C &=~(1<<5); 到这里引脚的寄存器配置算讲完了。 4、整体程序 (1)延时函数 /************************************************* *函数名:delay() *函数功能:延时函数,通过while循环占用CPU,达到延时功能 *输入:i *返回值:无 **************************************************/ void delay(int i) { while(i--); } (2)初始化空函数 void SystemInit(void) { } 这个是启动文件运行使要调用的函数,必须要,在后面章节使用库函数时,其它文件有,但在本节课程里,必须要在main.c文件中给出。 (3)主函数 int main() { *(unsigned int *)0x40021018 |=(1<<3); //打开GPIO时钟 *(unsigned int *)0x40010C00 &=~(0x0F<<(4*5)); //配置输出模式,先清0,在置位 *(unsigned int *)0x40010C00 |=(1<<(4*5)); *(unsigned int *)0x40010C0C &=~(1<<5); //配置输出低电平 while(1) { delay(0xFFFFF); *(unsigned int *)0x40010C0C |=(1<<5);//高电平 delay(0xFFFFF); *(unsigned int *)0x40010C0C &=~(1<<5);//低电平 } } 5、程序烧入 (1)配置生成hex文件 点击魔术棒 点击生成hex文件 (2)程序烧入 我这里使用普中提供的烧入软件烧入 6、实验结果 到此寄存器配置的介绍基本讲完,接下来正式进入标准库与HAL的对照学习中,后面会进行更新。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9055 浏览 16 评论
4086 浏览 18 评论
1174浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 22:37 , Processed in 1.335214 second(s), Total 77, Slave 58 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号