快速学会单片机开发 代码编写与测试教程

1. 简介

单片机的开发,第一步就是要安装好相关的开发工具,如keill,因为这涉及到了后面代码的编译、下载、调试等

就像大多数初学者刚开始学习编程语言一样,都是从写hello world开始的,而单片机的开发我们也从点一个灯开始,这时候我们就需要先看两个文档,分别是原理图和芯片手册,然后再编写程序

2. 看图

首先看原理图,看看需要点哪个灯,这个灯接在MCU的哪个引脚上。

如下图,我们需要点这个灯,这个灯接了一个3.3v,用我们以前学习过的知识,就可以知道把下图STATE_LED1拉低,这样这个发光二极管LED3就会发光。
在这里插入图片描述
我们再搜索一下,可以看见这个STATE_LED1是连在MCU的PC13引脚上的
在这里插入图片描述
此时我们知道了,我们需要控制MCU把这个PC13引脚拉低,打开芯片数据手册看看这个引脚是做什么功能来的,因为有些引脚是特殊功能引脚或者复用引脚,我们只需要把它设置成普通的IO脚就可以了,看手册是它就是普通的IO引脚
在这里插入图片描述
往下再看看架构图
在这里插入图片描述
看看相关存储器的映射图
在这里插入图片描述
在这里插入图片描述
了解完这些,我们就差不多可以开始写代码了

3. 编程

3.1 开启时钟

我们继续接着看芯片的数据手册,看到APB2寄存器的设置定义,然后把IOPC的使能打上,设置为1
在这里插入图片描述

3.2 设置引脚模式

接着我们需要把这个GPIOC的13引脚(PC13)设置为推挽输出模式
在这里插入图片描述

3.3 设置输出寄存器的高低电平

最后我们把这个GPIOC 13设置成低电平,这样led灯就可以亮了
在这里插入图片描述

3.4 编写代码

如上图,我们知道了相关寄存器的定义,也知道了需要把相关寄存器设置成什么样的值,这时我们就可以通过直接对其寄存器地址编程,不懂了可以去了解一下C语言的指针相关知识

int main(void)
{
//开启时钟,由映射图和相关寄存器说明可以知道GPIO时钟控制使能
*(unsigned int *) (0x40021000 + 0x18) |= (0x1 << 4) ; //使能APB2外设时钟 GPIOC

//设置硬件模式(输出 速度)
*(unsigned int *)(0x40011000 + 0x04) |= (0x1 << 20) ; //由相关寄存器图说明,复位后该值为00,我们这里需要设置为输出模式,速度为2MHz(没有特别需要和没有做功能引脚时,频率可以设置低一点,节能) 10
*(unsigned int *)(0x40011000 + 0x04) &= ~(0x1 << 22) ; //由相关寄存器图说明,复位后该值为01,我们这里设置成推挽输出模式00 (具体区别,我后续在GPIO中详细讲解)

//设置引脚高低电平
*(unsigned int *) (0x40011000 + 0x14) |= (0x1 << 13);

while(1);
}

如上我们就写完了一个点灯的代码了,但是可以看到代码不好阅读和理解,而且直接操作地址,很有可能出错。为了便于阅读和后面的维护与开发,我们可以用宏来定义这些相关寄存器,整理得如下

#define RCC_BASE  0x40021000
#define RCC_APB2ENR  *(unsigned int *)(RCC_BASE  + 0x18)

#define GPIOC_BASE  0x40011000
#define GPIOC_CRH  *(unsigned int *)(GPIOC_BASE + 0x04)
#define GPIOC_BRR  *(unsigned int *)(GPIOC_BASE + 0x14)

int main(void)
{
//开启时钟
RCC_APB2ENR |= (0x1 << 4) ; 
//设置引脚
GPIOC_CRH |= (0x1 << 20) ;
GPIOC_CRH &= ~(0x1 << 22) ; 
//拉低电平
GPIOC_BRR |= (0x1 << 13);

while(1);
}

可以看到,使用宏这样开发比较简单易懂,所以芯片厂也意识到了这个问题,他们就把这相关的寄存器给封装起来了,对我们开发者开放对应的功能接口,我们这边只需使用厂家封装好的函数接口就可以完成相关功能的开发了

详细的固件库讲解,我后面会写一篇文章来细讲
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
采用固件库整理代码如下

#include "stm32f10x.h"
#define STATE_LED1_PIN		GPIO_Pin_13
#define STATE_LED1_PORT		GPIOC
#define Enable_STATE_LED1()   STATE_LED1_PORT->BRR = STATE_LED1_PIN
#define Disable_STATE_LED1()   STATE_LED1_PORT->BSRR = STATE_LED1_PIN

Int main(void)
{
	GPIO_InitTypeDef  GPIO_Output_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

	GPIO_Output_InitStructure.GPIO_Pin = STATE_LED1_PIN ;
	GPIO_Output_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Output_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC, &GPIO_Output_InitStructure);

 	Enable_STATE_LED1();
}

4.下载编译与调试

写完代码后,我们就可以使用keil,编译一下代码,然后下载到板子上测试我们写的程序了

关于keil的使用,这个我后面会单独写一篇详细的文章来介绍,这里先放几张图片吧(好像挖了好多坑,以后慢慢补了)(狗头)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值