本人工作之余自学,该博客是为了记录学习过程,以及一些心得。内容如有出错,欢迎大家纠正,谢谢。

学习思路

最小硬件系统

1、 在意法半导体官网,下载数据手册、参考手册和电路原理图;
2、 根据原理图分析硬件,先分析最小系统;虽然STM32有内置时钟源,但是习惯上还是看成最小系统的一部分。下载和启动选择电路根据需求设定。
3、编写程序。

单片机内部架构

内核(Cortex-M3)和Debug是由ARM公司设计,其他的都是由半导体芯片厂商根据自身的需求设计,而我们日常的开发主要就是外设的设计。

常见外设

外设通过外设寄存器,才能控制。

存储结构

地址范围从0x0000 0000~0XFFFF FFFF,一共4GB,即32位CPU能访问的地址范围。
其中:0x0800 0000~0x0800 FFFF :存放下载的代码;
0x0200 0000~0x3FFF FFFF :内存—代码运行中产生的临时变量;
0x0400 0000~0x5FFF FFFF :外设寄存器;
0x0E00 0000~0XE00F FFFF :内部外设寄存器地址(中断、系统时钟);

实例一、操作开发板上的用户LED灯

1、 由原理图可知,User LED接在主控芯片引脚PA1串口;
2、 由外设寄存器存储结构图可知端口A(Port A),地址范围是从0x4001 0800~0x4001 0c00,共4个字节大小的地址范围。其中GPIOA有七个寄存器,每个寄存器都是32位。
3、 根据参考手册可知,其中GPIOA有七个寄存器,每个寄存器都是32位,不同寄存器有不同的功能。每个寄存器都有一个偏移地址。

4、 假设选取偏移地址为0x0C,控制引脚端口输出值(高低电平)的寄存器。由参考手册,可知0~15是可以使用的一共16位,每一位对应端口的一个引脚(GPIO 1就是PA1),而16~31位是预留。

5、 通过修改寄存器的值,就能控制单片机对应的外设,从而控制外设所连接的模块。

单片机的开发方法

1、 使用汇编操作寄存器—编写汇编代码操作寄存器

实例一:开发板LED灯,间隔1S闪烁

 PRESERVE8THUMB; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLY__Vectors       DCD     0DCD     Reset_Handler              ; Reset HandlerAREA    |.text|, CODE, READONLY; Reset handler
Reset_Handler   PROC; 使能GPIOA LDR R0, =(0x40021000 + 0x18)  ; RCC_APB2ENRLDR R1, [R0]ORR R1, R1, #(1<<2)STR R1, [R0];设置GPIOA_1为输出引脚LDR R0, =(0x40010800 + 0)  ; GPIOA_CRLLDR R1, [R0]ORR R1, R1, #(1<<4)STR R1, [R0]MainLoop; 设置GPIOA_1为输出高电平LDR R0, =(0x40010800 + 0xC)  ; GPIOA_ODRLDR R1, [R0]ORR R1, R1, #(1<<1)STR R1, [R0]BL Delay; 设置GPIOA_1为输出低电平LDR R0, =(0x40010800 + 0xC)  ; GPIOA_ODRLDR R1, [R0]BIC R1, R1, #(1<<1)STR R1, [R0]BL DelayB MainLoopDelayLDR R0, =300000
DelayLoopSUBS R0, #1BNE DelayLoopBX LRNOPENDPEND

2、 使用c语言操作寄存器

实例二:开发板LED灯,间隔1S闪烁

#define RCC_APB2ENR  (0x40021000 + 0x18)
#define GPIOA_BASE   (0x40010800)
#define GPIOA_CRL    (GPIOA_BASE + 0)
#define GPIOA_ODR    (GPIOA_BASE + 0X0c)void delay(volatile long i)
{while (i--);
}int main(void)
{volatile unsigned int *pRccApb2Enr;volatile unsigned int *pGpioaCrl;volatile unsigned int *pGpioaOdr;pRccApb2Enr = (volatile unsigned int *)RCC_APB2ENR;pGpioaCrl   = (volatile unsigned int *)GPIOA_CRL;pGpioaOdr   = (volatile unsigned int *)GPIOA_ODR;*pRccApb2Enr |= (1<<2);*pGpioaCrl |= (1<<4);while (1){*pGpioaOdr |= (1<<1);delay(1000000);*pGpioaOdr &= ~(1<<1);delay(1000000);}
}

以上使用汇编和c语言操作寄存器,适用于任意一款芯片,但需要了解对应寄存器,然后通过指针变量的方式指向寄存器。

3、 使用库开发

不需要知道外设寄存器的地址,只需要分析原理图,和使用哪一个引脚。

实例三:开发板LED灯,间隔1S闪烁

标准库主函数

#include "driver_led.h"/**  函数名:void LedGpioInit(void)*  输入参数:无*  输出参数:无*  返回值:无*  函数作用:初始化LED的引脚,配置为推挽输出
*/
void LedGpioInit(void)
{// 定义GPIO的结构体变量GPIO_InitTypeDef GPIO_InitStructure;// 使能LED的GPIO对应的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;         // 选择LED的引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 设置为推挽输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 引脚反转速度设置为快// 初始化引脚配置GPIO_Init(GPIOA, &GPIO_InitStructure);
}

标准库GPIO初始化

#include "driver_led.h"/**  函数名:void LedGpioInit(void)*  输入参数:无*  输出参数:无*  返回值:无*  函数作用:初始化LED的引脚,配置为推挽输出
*/
void LedGpioInit(void)
{// 定义GPIO的结构体变量GPIO_InitTypeDef GPIO_InitStructure;// 使能LED的GPIO对应的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;         // 选择LED的引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 设置为推挽输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 引脚反转速度设置为快// 初始化引脚配置GPIO_Init(GPIOA, &GPIO_InitStructure);
}

在主函数里面初始化LED灯,并在初始化函数里定义一个GPIO结构体,调用库函数进行初始化。
在主函数里,可以使用库函数提供的GPIO_WriteBit函数,操作GPIO输出相应的高电平和低电平。就不需要像c语言一样,自己操作对应的位,而是直接调用库函数。

ST公司先后推出标准库和HAL库,标准库只针对某一系列的芯片,缺乏移植性,而HAL支持STM32全系列,具有更高的抽象整合水平和移植性。

实例四:开发板LED灯,间隔1S闪烁

HAL库主函数

#include "main.h"
#include "driver_led.h"int main(void)
{    // 初始化HAL库函数必须要调用此函数HAL_Init();// 系统时钟即AHB/APB时钟配置SystemClock_Config();// 初始化LEDLedGpioInit();// 点亮LED灯while(1){HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);HAL_Delay(1000);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);HAL_Delay(1000);}
}

HAL库GPIO初始化

#include "driver_led.h"/**  函数名:void LedGpioInit(void)*  输入参数:无*  输出参数:无*  返回值:无*  函数作用:初始化LED的引脚,配置为上拉推挽输出
*/
void LedGpioInit(void)
{// 定义GPIO的结构体变量GPIO_InitTypeDef GPIO_InitStruct = {0};// 使能LED的GPIO对应的时钟__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_1;         // 选择LED的引脚GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 设置为推挽输出模式GPIO_InitStruct.Pull = GPIO_PULLUP;         // 默认上拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;// 引脚反转速度设置为快// 初始化引脚配置HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}

HAL库相比于标准库,HAL库多了初始化HAL库函数和系统时钟即AHB/APB时钟配置;
HAL库开发相比于标准库的LedGpioInit()函数,多了HAL_前缀。并且延迟函数HAL库也提供了。

创建项目工程

一、 自定义创建工程

二、 STM32CubeMX 创建工程模板

1、 从ST官网( https://www.st.com/zh/development-tools/stm32cubemx.html)下载STM32CubeMX,解压、安装、打开。首次运行会自动下载更新文件,待更新完成, 点击“ ACCESS TO MCU SELECTOR”通过选择芯片创建工程。

2、 随后在搜索框输入“ STM32F103C8”,右边选择“ LQFP48”封装,最后点击“ Start Project”,开始创建工程。

3、 随后进入引脚配置界面,该界面可以图形化选择芯片引脚并配置。

4、 点击“ Clock Configuration”进入时钟配置界面,在该界面可以图形化的配置时钟来源、 倍频、分频等。

5、 点击“ Project Manager”进入工程管理界面,在该界面先设置工程名字,再设置导出目标IDE为“ MDK-ARM”,版本默认V5.27。

6、 再点击“ Code Generator”,勾选下图所示,最后点击“ GENERATECODE”。

7、 待代码生成完后,出现提示,点击“ Open Project”打开工程。

8、 随后,将使用Keil自动打开工程,点击编译测试,编译成功,没有错误, 以后用户只需要在“ main()”里添加代码内容即可。

【百问网智能家居---基于单片机最小系统STM32F103C8T6_MINI的入门学习】相关推荐

  1. 【百问网智能家居5】ESP8266的相关知识

    [百问网智能家居5]ESP8266的相关知识 这是基于乐鑫资料和百问网资料总结而来,如有错漏,欢迎大家指正啊 一.ESP8266相关AT指令 AT 测试 AT 启动 AT+RST 重启模块 AT+GM ...

  2. 【百问网7天物联网智能家居】训练营学习笔记(七)

    在完成业务裸机的过程中,会用到freertos的任务通知和队列这两个内容 回顾下我们一开始的项目需求: 现在来看这个需求,在上了前面的课程后,相信大家心里已经有了实现它的方法脉络了 我们对于mini开 ...

  3. 7天物联网智能家居实战训练营(百问网)-day1

    目录 前言 一.学习路线 1.什么是嵌入式? 2.怎么学习嵌入式? 3.学习的基础内功? 二.基本概念 1.什么是arm? 2.arm架构的分类. 三.开发流程 1.交叉开发, 2.调试下载 前言 学 ...

  4. 【百问网7天物联网智能家居】训练营学习笔记(二)(需求分析,框架建立)

    构建一个项目的大致流程: 1,负责拉项目的同时,就叫市场部的同事吧,他们在外面和别的公司或者企业的人进行交流协商,得到一个项目: 2.然后再将这个项目交由研发部的负责人评估怎么做,研发部负责人召集手下 ...

  5. 百问网7天物联网智能家居 学习心得

    2020/2/12 打卡第一天 首先早上9点半黄老师准时开了,基础班第一节的培训. 主要讲的内容是:嵌入式的学习路线和职业规划.接下来我归类总结一下. 1.什么是嵌入式:电脑不属于嵌入式,以我的理解嵌 ...

  6. 单片机学习笔记1--资料下载、环境搭建(基于百问网STM32F103系列教程)

    第1篇 资料下载.环境搭建 第一章 百问网视频体系及学习路线 1.1课程视频变化 2011-2020:百问网录制了10年的Linux视频. 2021: 1.首次进入单片机领域,发布单片机课程! 2.重 ...

  7. 百问网七天物联网智能家居第2篇

    前面学习了ESP8266与手机的连接方式,可以先验证一下整个连接及发送数据流程,方便对整个功能的了解. 步骤如下:1 . 首先可以用百问网提供的软件工具,将mini开发板变成一个虚拟串口工具.当烧写完 ...

  8. 百问网七天物联网课程学习笔记——单片机时钟

    学习了百问网的智能家居实战训练营之后,对单片机的时钟树又有了更深刻的了解. 在现代的计算机操作系统中必定有一个时钟,在stm32f103系列的单片机中,时钟源有内部时钟源和外部时钟源之分,外部时钟源采 ...

  9. 百问网七天物联网课程学习笔记——单片机中断的使用

    学习了百问网的智能家居实战训练营之后,对单片机的中断又有了更深刻的了解. 中断,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中断(中止)当前程序的执行,而转去为事件服务,待服 ...

  10. 【百问网】七天智能家居实战

    以下是我在百问网7天物联网智能家居学习中的一些心得体会 一.GPIO GPIO口有八钟工作模式:推挽输出.开漏输出.复用推挽输出.复用开漏输出.浮空输入.模拟输入.上拉输入.下拉输入. 推挽输出:控制 ...

最新文章

  1. 重学前端之(4)函数、作用域、预解析
  2. “引用作为函数参数”与 “引用作为函数返回值”
  3. 刘强东退出武汉京东世纪贸易有限公司经理一职
  4. AWS披露面向Amazon S3的AI监控方案
  5. mathematic语法基础
  6. tableau系列之在 Tableau 中构建地图
  7. Redis技术贴一览表
  8. 真的不明白,怎么会这样!
  9. EXCEL表格-按条件求和、求平均值、求个数详解
  10. 【算法设计与分析】7、0/1背包问题,动态规划
  11. 告别传统IT 信天通信助推教育行业云化变革
  12. windows自动卸载程序
  13. 上面两点下面一个三角形_三角形光栅化
  14. 乐吾乐2D可视化之智慧城市可视化(一)
  15. dns网络服务器未响应是什么原因(如果各自方法都尝试后无法使用,请尝试重启猫)
  16. 2021澳洲wace高考成绩查询,官宣!2019澳洲WACE高考日程表发布!
  17. 国外安全网站、社区论坛、博客、公司、在线工具等整合收集
  18. [Python]学习笔记5——For循环
  19. 工业互联网创新迭代的推手
  20. Trimble.Business.Center.v3.90.6369.58741 Trimble TILOS v9.0+TILOS

热门文章

  1. Stanford nlp 初步之词性标注
  2. NLP常见词/典汇总
  3. 微信做音乐相册html5,如何制作微信音乐相册 微信音乐相册制作软件的精品教程...
  4. 用Python写一个记忆翻牌小游戏呀!
  5. 邮箱大师手机版服务器异常,网易邮箱大师-高效强大的全平台邮箱客户端
  6. linux奶瓶安装方法,ubuntu系统下怎么安装奶瓶
  7. 山东省首版次高端软件产品申报
  8. here i am(歌手BryanAdams的歌曲)
  9. EfficientDet:目标识别领域的 EfficientNet
  10. 数据库中COMMENT关键字的使用