STM32
文章平均质量分 95
STM32应用学习笔记
柯西的彷徨
道阻且长,行则将至。
展开
-
[022] [STM32] 使用DCMI(DVP)驱动OV2640
STM32F4系列的控制器具有DCMI(Digital camera Interface)数字摄像头接口,它支持使用类似VGA时序获取图像数据流,支持原始的按行、帧格式来组织的图像数据,如YUV、RGB,也支持接收JPEG格式压缩的数据流。9]的10位数据,将其存至16位字的低10位,其余最高有效位清零(位11~15)。使用DVP外设(即STM32的DCMI外设)采集摄像头数据,将DVP的FIFO数据缓存到内部RAM中,再使用DMA的M2M模式搬运到FSMC外设控制的内存中,最后让图像在屏幕上显示。原创 2022-09-09 17:55:48 · 9195 阅读 · 0 评论 -
[021] [STM32] FSMC外设详解及模拟驱动LCD编程
对于NOR FLASH/PSRAM控制器(存储块1),通过FSMC_BCRx、FSMC_BTRx和FSMC_BWTRx寄存器(其中x=1~4,对应bank的4个区)设置FSMC访问外部存储器的时序参数,拓宽了可选用的外部存储器的速度范围。因此,一般地址与器件挂载的片选引脚相关,当不同的FSMC_NE引脚连接不同的外部存储器时,访问的存储区域不一样,达到控制多块存储器的目的。位时,FSMC使用HADDR[25:1] 地址来作为对外部存储器的寻址地址,即HADDR1对应A0,实际向存储器写入的地址会向。原创 2022-09-09 17:45:10 · 6053 阅读 · 0 评论 -
[020] [STM32] CAN总线通信协议分析与应用
STM32ContentsCAN物理层CAN协议层STM32的CAN外设STM32的CAN控制相关结构体CAN通讯实验 1 CAN物理层CAN是一种异步通讯,只具有CAN_High和CAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。物理层形式分为两种:数据传输终端实际上就是两个阻抗为120欧姆的电阻,也称为终端电阻。总线上的总阻抗大概是60-70欧姆左右。 终端电阻的大小和传输线相关。CAN总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于CAN通讯协原创 2022-07-07 20:56:59 · 2574 阅读 · 1 评论 -
[019] [STM32] 利用定时器输出比较模式的翻转功能实现不同占空比和频率的PWM输出
第一次进入输出比较回调函数时,由于定时器翻转前的电平为**低**电平,因此会翻转为高电平,因此先将`CCR1` 寄存器值设为脉宽值,即高电平持续时间第二次进入输出比较回调函数时,将先前的高电平翻转为低电平,因此将`CCR1`值设为`period_val - duty_val`,即低电平持续时间原创 2022-04-04 20:59:16 · 3953 阅读 · 3 评论 -
[018] [STM32] 定时器 基本定时/输出比较/输入捕获功能详解与HAL库编程
**计数模块**- 核心计数器:对计数时钟CK_CNT进行二次计数- 计数器寄存器`TIMx_CNT`:存放核心计数器运行时的当前计数值**自动重载模块**由自动重载寄存器`TIMx_ARR`组成,根据定时器不同的**计数模式**:- **递增**计数模式:`TIMx_ARR`值为核心计数器的计数**终值**- **递减**计数模式:`TIMx_ARR`值为核心计数器的计数**初值**原创 2022-04-04 18:12:04 · 10157 阅读 · 1 评论 -
[017] [STM32] SPI协议详解及CubeMX+HAL函数配置分析
SPI(Serial Peripheral interface)串行外围设备接口是**同步全双工**的通信总线,在芯片的管脚上只占用**四**根线。- `SS/NSS/CS`:从设备选择信号线(**片选信号线**)。由主设备控制,选择指定的从设备。 > 当主机要**选择从设备时**,把该从设备的**SS信号线设置为低电平**,该从设备即被选中,即**片选有效**,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以**SS线置低电平为开始信号**,以**SS线被拉高作为结束信号**。- `原创 2022-04-02 22:44:31 · 12537 阅读 · 3 评论 -
[016] [STM32] 串口HAL库轮询、中断、DMA方式传输数据
串口收发单元主要利用:数据寄存器`DR`、发送引脚TX、接收引脚RX,以及状态寄存器`SR`的数据寄存器为空`TXE`标志、数据传输完成`TC`标志、接收寄存器非空`RXNE`标志。原创 2022-03-31 16:47:01 · 5265 阅读 · 1 评论 -
[015] [STM32] IIC协议详解与HAL库相关函数分析
IIC(Inter Integrated Circuit)总线在物理层由SDA(Serial data, 串行数据线)、SCL(Serial clock line,串行时钟线)和上拉电阻组成。- 每个连接到总线的设备都**有一个独立的地址**,主机可以利用此地址进行不同设备之间的访问- 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 - 为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是**漏极开路(OD)**输出或**集电极开路(OC)**输出(IIC的空闲状态只能有原创 2022-03-29 22:48:51 · 5576 阅读 · 1 评论 -
[014] [STM32] 启动模式&在SRAM中调试代码
因为Cortex-M3/4复位时会从`0x00000000`和`0x00000004`的相对位置取出MSP初值以及将复位向量地址赋给PC,在SRAM中的绝对位置就是`0x20000000`和`0x20000004`。STM32F1系列貌似从SRAM启动复位时,不会自动取出这两个值,因此无法正常运行。因此,需要点击debug引导`.ini`中的文件来初始化pc和sp指针,同时调试时不能点RST,必须退出重新进入debug以复位,同时也不能硬件复位。此外,如果还有问题可以试试`keilkill.bat`原创 2022-03-19 00:03:19 · 1586 阅读 · 0 评论 -
[013] [STM32] armclang对结构体位域的过渡优化——导致未按字对齐访问寄存器引发的异常
GPIO外设寄存器必须按字对齐方式访问,否则会引发异常(不同外设对齐方式不一样,需查看手册)结构体位域方式操作寄存器时,即便用volatile关键字告知编译器必须按字访问,但是armclang依然会优化成按字节访问(可能是版本问题)armcc编译器不加volatile也会按字访问,但代码量与编译器速度都不如armclang原创 2022-03-18 02:37:14 · 1044 阅读 · 0 评论 -
[012] [STM32] 代码重定位与清除BSS段深入分析
- 当加载地址与链接地址不同时则需要重定位- 散列文件中描述了程序的加载域和执行域的起始地址和长度- 重定位只能使用位置无关指令,即都是相对于当前PC偏移进行跳转的- 重定位即复制数据,需了解源(加载地址)、目的(链接地址)、长度(复制数据的长度),这些可以通过armlink提供的symbol中获取- keil中,变量>8字节才会放入到bss段,否则存放在rw_data中,使用bss段变量前需要将其清零- 在重定位代码段时,需要将flash第二条指令存放的`Reset_Handler`地址修改原创 2022-03-16 00:51:48 · 3543 阅读 · 6 评论 -
[011] [STM32] MDK使用命令行进行编译与链接
Keil MDK是常用的嵌入式集成开发环境(Integrated Development Environment),使用IDE,很容易操作,点点鼠标就可完成:* 添加文件* 指定文件路径(头文件路径、库文件路径)* 指定链接库* 编译、链接* 下载、调试那么每次点击MDK后会执行什么命令?原创 2022-03-14 16:30:12 · 3394 阅读 · 0 评论 -
[010] [STM32] 串口通信基础知识与编程
- 波特率:每秒传输的码元个数。串口通信中采用一个二进制位表示一个码元,因此波特率=比特率(bit/s)- 起始位:先发出一个逻辑”0”的信号,表示传输数据的开始。- 数据位:可以是5~8位逻辑”0”或”1”,如ASCII码(7位),扩展BCD码(8位),一般为**小端**传输。- 校验位:一帧数据(数据位+校验位)中“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。- 停止位:一个字符数据的结束标志,一帧数据传输完成后进入逻辑"1"状态,状态持续时间可编程控制(0.5、1原创 2022-03-14 02:03:25 · 3161 阅读 · 0 评论 -
[009] [STM32] STM32F407软件仿真提示error 65: access violation at 0x40023C00 : no ‘read‘ permission
# 1 问题描述MDK软件模拟仿真提示没有读写权限,只能单步运行。error提示:```c*** error 65: access violation at 0x40023C00 : no 'read' permission```**原因**:map地址空间权限映射有问题。部分地址空间没有读写的权限,造成程序不能自动运行。# 2 解决方法## 2.1 方法一修改工程配置选项中的debug选项卡,STM32F1系列芯片验证可以正常使用。**F4系列芯片不能正常使用**。![在这里插入图片原创 2022-02-27 15:43:50 · 4795 阅读 · 4 评论 -
[008] [STM32] 状态机与异或
# 1 状态机状态机是一个抽象概念,表示把一个过程抽象为若干个状态之间的切换,这些状态之间存在一定的联系。状态机的设计主要包括4个要素:1. `现态`:是指当前所处的状态。2. `条件`:当一个条件满足,将会触发一个动作,或者执行一次状态的迁移。3. `动作`:表示条件满足后执行动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作要素不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。4. `次态`:表示条件满足后要迁往的新状态。状态机应用参考:[以面向对象的思原创 2022-02-20 00:52:07 · 722 阅读 · 0 评论 -
[007] [STM32] 以面向对象的思想编写按键程序
CubeMX配置RCC:配置HSE为晶体/陶瓷谐振器SYS:Debug选择SW模式时钟:选择HSE作为PLL时钟源,将其改为8MHz(默认),然后选择PLLCLK作为系统时钟源,设为系统时钟为72MHz按键引脚:PA0(wk_up)下拉输入,PA15(key1)和PC5(key0)上拉输入LED引脚:PA8(红灯)和PD2(黄灯)设为推挽输出,默认输出高电平TIM6:向上计数模式(TIM6&7只支持向上计数),psc = 72 - 1,arr = 1000 - 1,即1ms更新中断,原创 2022-02-19 17:33:25 · 2599 阅读 · 3 评论 -
[006] [STM32] GPIO模块锁定机制的bug
typedef struct{ __IO uint32_t CRL; __IO uint32_t CRH; __IO uint32_t IDR; __IO uint32_t ODR; __IO uint32_t BSRR; __IO uint32_t BRR; __IO uint32_t LCKR;} GPIO_TypeDef;````LCKR`即为GPIO模块端口配置锁定寄存器,具体用法如下:- 用于锁定GPIO模块相应引脚的`CRL`和`CRH`端口配置寄存器,一但原创 2022-02-18 15:10:13 · 1067 阅读 · 4 评论 -
[005] [STM32] GPIO工作模式与寄存器详解
`VDD`:D=device 表示芯片内部工作电源(一般VDD<VCC)。端口引脚电路中的VDD表示能够容忍3.3V电压(最大3.6V),如果是VDD_FT则表示能够忍5V。`VSS`:S=series 表示公共连接,通常指电路公共接地端电压。- **TTL肖特基触发器**TTL肖特基触发器即为用肖特基管构成的施密特触发器,施密特触发器利用门阀电压将引脚**模拟**信号变成**矩形**信号,进行转化为0/1数字信号存入输入数据寄存器。- **端口引脚保护二极管**当引脚电压高于VDD 时,原创 2022-02-18 02:28:31 · 6678 阅读 · 0 评论 -
[004] [STM32] MDK工程配置与调试
不使用软件仿真可以不用管Xtal参数。MrcroLIB对C库进行了裁剪优化,很多C库函数不能直接使用,添加下列代码可以在不使用微库下,正常使用`printf`和`scanf`重定向到串口等输出设备:```c#pragma import(__use_no_semihosting)struct __FILE{ int a;};FILE __stdout;FILE __stdin;void _sys_exit(int x){ }```## 1.3 Output![在这里插入原创 2022-02-17 02:36:06 · 2588 阅读 · 0 评论 -
[003] [STM32] CubeMX工具使用
# 1.1 启动界面![在这里插入图片描述](https://img-blog.csdnimg.cn/15e005fadcee4b1bbbc6af449b6b90c2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p-v6KW_55qE5b235b6o,size_20,color_FFFFFF,t_70,g_se,x_16)- `File`:新建、导入、保存、关闭、生成工程等- `Windo原创 2022-02-16 23:53:43 · 1663 阅读 · 0 评论 -
[002] [STM32] HAL库驱动框架
- 外设句柄结构体包含两部分:属性与回调函数指针。- HAL三种编程模型:轮询、中断、DMA。- `HAL_xx_MspInit`用于初始化底层外设(GPIO、时钟、DMA、中断等),再调用`HAL_xx_Init`初始化对应的外设寄存器,函数参数均为句柄结构体。- 以`ex`结尾的文件表示该芯片的特有功能,为了兼容产品系列中的不同芯片。原创 2022-02-16 21:09:09 · 777 阅读 · 2 评论 -
[001] [STM32] 如何下载STM32原厂资料
# 1 官网下载> [ST官网](https://www.st.com/): https://www.st.com/直接在搜索框输入使用的芯片型号,如`stm32f103c8t6`:![在这里插入图片描述](https://img-blog.csdnimg.cn/8977e66ffbdf4795903f2c9f7ac0e3fe.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p-v6KW_55原创 2022-02-13 16:24:20 · 1885 阅读 · 0 评论