![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STM32
文章平均质量分 80
STM32F103C8T6、STM32F103ZET6芯片学习笔记
ONE_Day|
这个作者很懒,什么都没留下…
展开
-
LX12864P1屏幕使用介绍(ST7567驱动),显示横线、字符、图形
通信方式有并行的6800和8080,以及串行的4线方式,本次实验使用了4线串行通信,CSB为片选引脚,数据传输前拉低CSB,A0引脚说明传输的是数据还是指令,如果A0为0,说明是指令,如果为1,说明是数据,SCL为时钟线,SDA为数据/指令线,SCL为低电平时放数据或指令,SCL为高电平是ST7567读取SDA上的电平信号。初始化命令中,设置对比度由两条指令组成,一定要先发送指令0x81,告诉ST7567接下来的一条指令是设置对比度的,再发送对比度的值,例如0x1B,由6位来控制;原创 2022-11-19 21:44:23 · 8637 阅读 · 2 评论 -
STM32串口通信-简单版
USART_SendByte函数体内容可以直接拷贝标准库函数USART_SendData的内容,然后在最后加上等待TXE标志位的while循环即可,因为发送字符串函数需要调用到这个USART_SendByte函数,所以避免在发送字符串时前一个字符还没有转移到移位寄存器,就被后一个字符给覆盖了,造成数据丢失的情况。正因为原子的串口中断函数写有点复杂,不太好懂,但懂了之后发现其写法挺不错的,不过有时候只需要实现简单的功能,不想写这么复杂,所以这里编写一个简单的中断处理函数,将串口接收到的数据再发送回去。原创 2022-10-15 15:47:43 · 1036 阅读 · 0 评论 -
STM32-RTC实时时钟
RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。RTC时钟源有三种来源,分别是HSE的128分频,LSE时钟源,LSI时钟源,一般RTC选择的是LSE时钟源,也就是外部低速时钟源,外接一个32.768KHz的晶振,因为这个时钟源比较准确。第一个是RTC预分频模块,它可以编程产生最长1秒的RTC时间基TR_CLK,如果设置了秒中断允许位,可以产生秒中断。2、设置寄存器 PWR_CR 的DBP位,使能对RTC和后备寄存器的访问。原创 2022-10-02 16:31:38 · 2233 阅读 · 0 评论 -
STM32-ADC基本原理
Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。原创 2022-10-02 16:07:44 · 1998 阅读 · 0 评论 -
STM32-DMA(直接存储器访问)
DMA 全称Direct Memory Access,即直接存储器访问DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。作用:DMA的就是CPU的助手、数据搬运工。STM32F1最多有2个DMA控制器,DMA2仅存在大容量产品中,DMA1有7个通道,DMA2有5个通道。原创 2022-10-02 14:35:58 · 860 阅读 · 0 评论 -
STM32独立看门狗使用介绍
STM32内置两个看门狗,提供了更高的安全性,时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗 / 窗口看门狗)可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合。窗口看门狗由从APB1时钟分频后得到时钟驱动。原创 2022-10-02 14:29:51 · 1455 阅读 · 1 评论 -
Keil编译完成后出现的程序大小说明
为什么烧写的时候,没有烧写 ZI Data,这是因为 ZI Data 是没有初始化的数据,默认的是0,只要程序运行之前将ZI数据所在的区域位置清0即可,没有必要包含到flash里面。栈的空间位置就出在 ZI Data 里。ZI-data:Zero-Init-data,代表未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处,存储在SRAM中。RW-data:Read-write-data,代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处,存储在SRAM中;原创 2022-10-02 14:20:11 · 2533 阅读 · 0 评论 -
STM32-端口复用和重映射
STM32有很多的内置外设(串口、ADC、DAC等),这些外设的外部引脚都是与GPIO复用的。包就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。例如串口1的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作 GPIO, 而用做复用功能串口1的发送接收引脚的时候,叫端口复用在STM32F103ZET6的芯片数据手册的第3章Pinouts and pin descriptions可以看到端口复用的表格。原创 2022-09-10 14:09:52 · 1242 阅读 · 1 评论 -
STM32F1定时器-PWM输出
因为dir初始化为1,所以进入while循环后,led0pwmval++,等led0pwmval增加到大于300时,dir 被置为 0,led0pwmval又开始减少,减到0后,dir置为1,led0pwmval再增加,如此反复。ARPE = 0时更新事件,意思是在CNT计数器计数过程中,在计数溢出之前,人为改变了ARR寄存器的值,写入了新值,那这个新值会在下一个计数周期才生效,在写入新值的当前周期里,还是计数到旧值就产生溢出。简单的说, ARPE=1,ARR立即生效;0:高电平有效,1:低电平有效。原创 2022-09-10 13:52:49 · 7304 阅读 · 0 评论 -
STM32定时器-输入捕获
的频率,连续采样到8次通道1的电平,如果都是高电平,则说明这是一个有效的触发,就会触发输入捕获中断(如果开启了的话)。一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMxCCRx)里面,完成一次捕获。N值就是滤波长度,举个简单的例子:假设ICIF[3:0]=0011,并设置IC1映射到通道1上,且为上升沿触发,那么在捕获到上升沿的时候,再以f。连续采集8次通道1的电平,起。原创 2022-09-08 13:59:31 · 4998 阅读 · 1 评论 -
STM32F103通用定时器介绍(中断实验)
STM32F10x系列总共最多有8个定时器对于STM32F103RC,有4个通用定时器,2个高级定时器,2个基本定时器对于STM32F103ZE,有4个通用定时器,2个高级定时器,2个基本定时器STM32F103C8T6有4个定时器,分别是TIM1,TIM2,TIM3,TIM4。原创 2022-09-08 11:49:35 · 7083 阅读 · 0 评论 -
串口通信printf函数重定向
printf函数重定向在51单片机的串口通讯也使用过,但51重写的时putchar函数,这次STM32重写的是fputc函数和fgetc函数,至于为什么51和STM32重写的函数不同,但都能用printf函数往串口打印,可以看51串口重写printf函数那篇文章。是ARM单片机的一种调试机制,它需要通过仿真器来连接电脑和ARM单片机,并调用相应的指令来实现单片机向电脑显示器打印信息。fputc是printf函数的底层函数,所以重写了fputc函数后,printf函数也会发生改变,scanf函数比较少用。原创 2022-09-08 11:26:02 · 2510 阅读 · 0 评论 -
窗口看门狗使用介绍
之所以称为窗口看门狗就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。而独立看门狗限制喂狗时间在0-x内,x由相关寄存器决定。0就相当于刚开始倒计数就喂狗,x就相当于快要计数到0时喂狗,喂狗的时间不能过晚。STM32F的窗口看门狗中有一个7位的递减计数器T[6:0],它会在出现下述2种情况之一时产生看门狗复位:1.当喂狗的时候如果计数器的值大于某一设定数值W[6:0]时,此设定数值在WWDG_CFR寄存器定义。原创 2022-09-07 16:17:21 · 2897 阅读 · 0 评论 -
STM32-串口通信波特率计算以及寄存器的配置详解
当通信线路上电平状态为1,表示当前线路上没有数据传送,串口处于空闲。1.起始位:先发出一个逻辑"0"的信号,表示传输字符的开始。2.数据位(8位或者9位):紧接着起始位之后,数据位的个数可以是4、5、6、7、8等,构成一个字符,从最低位开始传送。3.奇偶校验位(第9位):数据位加上这一位后,使得"1"的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。可有可无,CRC校验更准确4.停止位(1,15,2位):它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。原创 2022-09-02 10:57:54 · 13162 阅读 · 1 评论 -
STM32-外部中断
STM32的每个IO都可以作为外部中断输入STM32F1的中断控制器支持19个外部中断/事件请求:线0 ~ 15:对应外部IO口的输入中断。线16:连接到PVD输出。线17:连接到RTC闹钟事件。线18:连接到USB唤醒事件。每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发(上升沿和下降沿都可)),触发/屏蔽,专用的状态位。原创 2022-09-02 10:42:08 · 1623 阅读 · 0 评论 -
STM32-按键检测
因为key_up被初始化为1,第一次按下时,if(key_up && KEY被按下)判断为真,检测KEY确实被按下后,key_up被置为0,返回 KEY_Value 然后return退出,假如是一直按着按键的,那下一次进行按键检测时,if(mode == 1) 为真,key_up = 1,所以 if(key_up && KEY被按下)判断又为真,继续进入里面执行,继续返回KEY_Value,达到连续按效果。然后通过对寄存器进行操作,采用异或的功能,取反某一位,达到按一次亮,再按一次熄灭的效果。原创 2022-09-02 10:25:11 · 8998 阅读 · 0 评论 -
JTAG、SWD调试原理简析
STM32F10xxx使用CortexM-M3内核,该内核内含硬件调试模块,支持复杂的调试操作。这是标准的ARM CoreSight调试接口,包括JTAG-DP接口(5个引脚)和SW-DP接口(2个引脚)。JTAG调试接口(JTAG-DP)为AHP-AP模块提供5针标准JTAG接口。这些引脚如果被作为JTAG和SWD调试引脚时,是不能作为普通IO引脚的,输出不了正常的电平状态;在SWJ-DP接口中,SW-DP接口的2个引脚和JTAG接口的5个引脚中的一些是复用的。JTAG调试接口(JTAG)...原创 2022-08-31 21:33:50 · 3098 阅读 · 0 评论 -
STM32使用库函数点灯实验
1 个初始化函数 : void GPIO_Init(GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_InitStruct);2 个读取输入电平函数 : uint8_t GPIO_ReadlnputDataBit(GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin);原创 2022-08-31 21:28:24 · 1284 阅读 · 0 评论 -
STM32寄存器LED灯闪烁以及位带操作
这里就简单写了个延时函数,虽然能实现LED灯闪烁的效果,但这个延时是让CPU在循环里执行来耗费时间,这个期间CPU不能执行其他操作,而且不像51单片机,有STC-ISP工具来生成一个比较准确的时间,这里循环耗费的时间我也不知道是多少。在Cortex-M3权威指南中,有位带的介绍和使用说明,目的是为了使引脚像51那样对某个地址直接置1或置0,就能使LED灯被熄灭或者点亮,需要根据公式来对位进行映射,目前了解知道有这个即可,平时比较少用。将点亮LED灯的工程复制一份后,命名为LED灯闪烁实验。...原创 2022-08-31 21:21:41 · 1872 阅读 · 0 评论 -
STM32使用寄存器点灯实验
分别用三种不同的写法实现点亮LED灯,方法一是直接往寄存器写入十六进制,方法二是用移位的方法初始化寄存器,但这两种方法的数值第一眼看去不好理解,不看参考手册的话很难知道0xFFF4是初始化什么,(u16)0x01...原创 2022-08-30 14:16:11 · 2839 阅读 · 0 评论 -
STM32 GPIO工作原理
STM32F103ZET6:共有7组IO口,每组IO口有16个IO-—共16X7=112个IO编号为:GPIOA,GPIOB……GPIOG,从A到G刚好7组STM32F103RCT6:共有4组IO口,共16X3+3 = 51个IO编号为:GPIOA0 ~ GPIOA15 GPIOB0 ~ GPIOB15 GPIOC0 ~ GPIOC15 GPIOD0 ~ GPIOD2STM32的大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚(比如串口)在STM32F103ZET6的数据手册中可以原创 2022-08-30 14:03:15 · 1737 阅读 · 0 评论 -
STM32寄存器地址名称映射关系
形象理解:就好比盖楼,地面(基地址)为0米,第二层比地面高4米,这4米就是相对地面来说的偏移量,则第二层的高度(地址)是0 + 4 = 4,第三层比第二层高3米,这3米是相对第二层来说的偏移量,因为第二层高度(地址)已经是4,则第三层高度(地址)是4 +3 = 7。最后GPIOA_BASE地址强制转换为了GPIO_TypeDef结构体类型,所以GPIOA便指向了该结构体第一个寄存器CRL的首地址上,因为结构体存储的成员的地址是连续的,所以知道首地址,再根据每个成员的偏移量,便能推算出每个寄存器的地址了。..原创 2022-08-29 14:34:02 · 917 阅读 · 0 评论 -
NVIC中断优先级管理
1.系统运行后先设置中断优先级分组。整个系统执行过程中,只设置一次中断分组。3.如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。原创 2022-08-29 14:31:55 · 2311 阅读 · 0 评论 -
Systick滴答定时器解析
temp&(1原创 2022-08-28 13:41:39 · 1795 阅读 · 0 评论 -
SystemInit()时钟系统初始化函数解析
行数76:RCC_CFGR_PLLSRC = 0x00010000,RCC_CFGR_PLLXTPRE = 0x00020000,RCC_CFGR_PLLMULL = 0x003C0000,三个相或,得到0x003F0000,然后取反,得到0xFFC0FFFF,用&操作,CFGR寄存器的 21、20、19、18、17、16位清零,其他位不变。行数91:RCC_CFGR_SW_PLL = 0x00000002,CFGR寄存器的第1位置1,SW为10,PLL输出作为系统时钟;...原创 2022-08-28 13:35:44 · 4018 阅读 · 0 评论 -
STM32keil设置中的宏定义STM32F10X_MD,USE_STDPERIPH_DRIVER作用以及用VS Code编写stm32代码配置问题
在创建STM32标准库工程模板时,要在keil的C/C++设置中添加下面的宏定义,注意中间是英文逗号隔开在stm32f10x.h文件中有这样预处理代码# if!!(# if!)# if!&&# if!!(# if!)# if!&&# if!!(# if!)# if!&&# if!!(# if!)# if!&&# if!!(# if!)# if!&&# if!!defined。...原创 2022-08-27 14:01:04 · 7805 阅读 · 1 评论 -
STM32时钟系统
左下角的Sec就是程序运行的时间,在代码的11,12行加上断点,按全速运行,执行到11行就停下来,但并没有执行delay_ms函数,再按一次全速运行,执行到12行,此时delay_ms函数就被执行了,主要通过Sec查看延时函数运行的时间。CSS:时钟监视系统,一般系统时钟会选择HSE作为时钟源,HSE是由外部晶振产生的,具有不稳定性,假如外部晶振坏了,HSE失效了,CSS会检测到,然后自动切换到HSI,使用内部振荡器作为系统时钟,使系统继续工作。任何一个外设在使用之前,必须首先使能其相应的时钟。...原创 2022-08-27 13:32:11 · 3786 阅读 · 0 评论 -
STM32概述
新的基于ARM内核的32位MCU系列内核为ARM公司为要求高性能、低成本、低功耗的嵌入式应用专门设计的Cortex-M内核标准的ARM架构。原创 2022-08-25 18:06:45 · 8895 阅读 · 0 评论 -
晶振与定时时间的简单理解
次是1ms,那7200次就是定时0.1ms,而0.1ms = 0.0001s,时间的倒数就是频率,所以1/0.0001s = 10000 = 10khz。既然知道经过分频后定时为0.1ms,所以重装载值arr+1 = 4999+1 = 5000,5000 * 0.1ms = 500ms。psc = 7199,7199+1 = 7200,就表示晶振振动7200次,已经知道72 * 10。次,所以每一次振动的时间为1/9 * 10。要计算1ms,就振动9 * 10。,即晶振振动72次就定时1us。原创 2022-08-23 14:04:27 · 3903 阅读 · 0 评论 -
如何查找不同芯片keil软件仿真要配置的参数DAMSTM.DLL、-pSTM32F103C8
软件仿真时,芯片外部晶振时钟要根据实际选择,不然运行时间不准确,这里时钟要选择8MHz,对应开发板的外接晶振频率。软件仿真需要选择 Use Simulator,下面的红框参数可以从KEIL软件给的芯片数据查看。DARMSTM.DLL是软件仿真时用的参数,TARMSTM.DLL是硬件仿真时用的参数。输入要查看的芯片名字后,就能在下面数据框中看到软件仿真需要填入的参数了。点击软件的File选项,然后点击Device Database。这里以C8T6为例,其他芯片查找方法也一样。原创 2022-08-23 13:44:01 · 1326 阅读 · 0 评论 -
STM32数据类型重定义说明
在早期的标准库版本中有24个变量定义,在Keil的安装根目录下,可以找到对应的定义,路径为:Keil\ARM\INC\ST\STM32F10x\stm32f10x_type.h3.0以后的版本中使用了CMSIS数据类型,变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。原创 2022-08-22 14:07:18 · 1156 阅读 · 0 评论 -
STM32标准库(固件库)分析
STM32标准外设库之前的版本也称固件函数库或简称固件库,是⼀个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每⼀个外设的驱动描述和应⽤实例,为开发者访问底层硬件提供了⼀个中间API,通过使⽤固件函数库,⽆需深⼊掌握底层硬件细节,开发者就可以轻松应⽤每⼀个外设。因此,使⽤固态函数库可以⼤⼤减少⽤户的程序编写时间,进⽽降低开发成本。每个外设驱动都由⼀组函数组成,这组函数覆盖了该外设所有功能。原创 2022-08-22 13:57:56 · 12583 阅读 · 0 评论 -
STM32的四种开发方式
并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。且官方的驱动库为了容错性高一些等原因,会引入一些判断机制,相对复杂一些,但是实际上有的东西是我们用不到的,这就会造成代码执行效率会相对低一些。原创 2022-08-20 13:39:54 · 8947 阅读 · 2 评论 -
STM32下载程序的三种方法(串口、ST-LINK、 ST-LINK Utility)
4.将ST-Link V2的SWDIO、GND、SWCLK、3.3V接到开发板的DIO、GND、CLK、3.3引脚上,有些板的丝印标法不同,但都能对应的看出来,然后将ST-Link插电脑上。点击Add,看手上的开发板是什么型号,手上的是STM32F103C8T6,就找到STM32F10x系列的,选择中容量Med-density,128k的,最后点击确定。5.可以点击Target的Program选项开始下载,也可以直接点击下图中的图形,弹出下载框后,确保下载文件没错后,点击Start,进行程序下载。...原创 2022-08-12 11:47:31 · 51400 阅读 · 4 评论 -
JTAG、SWD、JLINK、ST-LINK、ULINK的区别
简单来说,下载调试器是将PC(例如通过USB协议)发送的命令转换为MCU(负责MCU内部外围设备)理解的语言(例如SWD或JTAG协议)的设备,加载代码并精确控制执行。简单来说,标准是一组规则和协议,特定行业中的每个参与者都同意遵循并执行。符合某种内核的单片机,都可以使用这种协议来下载程序。JTAG和SWD其实都是一种标准的协议。比如JTAG和SWD,都支持下载ARM内核单片机的程序。...原创 2022-07-26 13:11:18 · 7528 阅读 · 3 评论