【百问网智能家居---基于单片机最小系统STM32F103C8T6_MINI的入门学习】
本人工作之余自学,该博客是为了记录学习过程,以及一些心得。内容如有出错,欢迎大家纠正,谢谢。
学习思路
最小硬件系统
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的入门学习】相关推荐
- 【百问网智能家居5】ESP8266的相关知识
[百问网智能家居5]ESP8266的相关知识 这是基于乐鑫资料和百问网资料总结而来,如有错漏,欢迎大家指正啊 一.ESP8266相关AT指令 AT 测试 AT 启动 AT+RST 重启模块 AT+GM ...
- 【百问网7天物联网智能家居】训练营学习笔记(七)
在完成业务裸机的过程中,会用到freertos的任务通知和队列这两个内容 回顾下我们一开始的项目需求: 现在来看这个需求,在上了前面的课程后,相信大家心里已经有了实现它的方法脉络了 我们对于mini开 ...
- 7天物联网智能家居实战训练营(百问网)-day1
目录 前言 一.学习路线 1.什么是嵌入式? 2.怎么学习嵌入式? 3.学习的基础内功? 二.基本概念 1.什么是arm? 2.arm架构的分类. 三.开发流程 1.交叉开发, 2.调试下载 前言 学 ...
- 【百问网7天物联网智能家居】训练营学习笔记(二)(需求分析,框架建立)
构建一个项目的大致流程: 1,负责拉项目的同时,就叫市场部的同事吧,他们在外面和别的公司或者企业的人进行交流协商,得到一个项目: 2.然后再将这个项目交由研发部的负责人评估怎么做,研发部负责人召集手下 ...
- 百问网7天物联网智能家居 学习心得
2020/2/12 打卡第一天 首先早上9点半黄老师准时开了,基础班第一节的培训. 主要讲的内容是:嵌入式的学习路线和职业规划.接下来我归类总结一下. 1.什么是嵌入式:电脑不属于嵌入式,以我的理解嵌 ...
- 单片机学习笔记1--资料下载、环境搭建(基于百问网STM32F103系列教程)
第1篇 资料下载.环境搭建 第一章 百问网视频体系及学习路线 1.1课程视频变化 2011-2020:百问网录制了10年的Linux视频. 2021: 1.首次进入单片机领域,发布单片机课程! 2.重 ...
- 百问网七天物联网智能家居第2篇
前面学习了ESP8266与手机的连接方式,可以先验证一下整个连接及发送数据流程,方便对整个功能的了解. 步骤如下:1 . 首先可以用百问网提供的软件工具,将mini开发板变成一个虚拟串口工具.当烧写完 ...
- 百问网七天物联网课程学习笔记——单片机时钟
学习了百问网的智能家居实战训练营之后,对单片机的时钟树又有了更深刻的了解. 在现代的计算机操作系统中必定有一个时钟,在stm32f103系列的单片机中,时钟源有内部时钟源和外部时钟源之分,外部时钟源采 ...
- 百问网七天物联网课程学习笔记——单片机中断的使用
学习了百问网的智能家居实战训练营之后,对单片机的中断又有了更深刻的了解. 中断,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中断(中止)当前程序的执行,而转去为事件服务,待服 ...
- 【百问网】七天智能家居实战
以下是我在百问网7天物联网智能家居学习中的一些心得体会 一.GPIO GPIO口有八钟工作模式:推挽输出.开漏输出.复用推挽输出.复用开漏输出.浮空输入.模拟输入.上拉输入.下拉输入. 推挽输出:控制 ...
最新文章
- 重学前端之(4)函数、作用域、预解析
- “引用作为函数参数”与 “引用作为函数返回值”
- 刘强东退出武汉京东世纪贸易有限公司经理一职
- AWS披露面向Amazon S3的AI监控方案
- mathematic语法基础
- tableau系列之在 Tableau 中构建地图
- Redis技术贴一览表
- 真的不明白,怎么会这样!
- EXCEL表格-按条件求和、求平均值、求个数详解
- 【算法设计与分析】7、0/1背包问题,动态规划
- 告别传统IT 信天通信助推教育行业云化变革
- windows自动卸载程序
- 上面两点下面一个三角形_三角形光栅化
- 乐吾乐2D可视化之智慧城市可视化(一)
- dns网络服务器未响应是什么原因(如果各自方法都尝试后无法使用,请尝试重启猫)
- 2021澳洲wace高考成绩查询,官宣!2019澳洲WACE高考日程表发布!
- 国外安全网站、社区论坛、博客、公司、在线工具等整合收集
- [Python]学习笔记5——For循环
- 工业互联网创新迭代的推手
- Trimble.Business.Center.v3.90.6369.58741 Trimble TILOS v9.0+TILOS