- 博客(26)
- 收藏
- 关注
原创 理解竞态条件及其解决方法
竞态条件是由于多个线程对共享资源的非原子访问导致的,这会使得操作交错执行并导致数据不一致。通过使用互斥锁或其他同步机制,可以确保对共享资源的访问是原子操作,从而避免竞态条件。
2024-06-28 14:07:25 1110 1
转载 CAN错误
https://blog.csdn.net/weixin_40528417/article/details/79771270?spm=1001.2014.3001.5501
2021-07-03 16:47:44 869
原创 19 . 窗口看门狗(WWDG)实验
窗口看门狗(WWDG)实验上一篇我们介绍了独立看门狗IWDG,这一篇我们来学习下窗口看门狗(以下简称WWDG)。要实现的功能是:使用窗口看门狗的中断来喂狗,通过D1、D2 指示灯提示程序运行状态。学习本章可以参考《STM32F10x 中文参考手册》-18窗口看门狗(WWDG)章节。分为如下几部分内容:1 WWDG 介绍2 WWDG 配置步骤3 硬件设计4 软件设计WWDG 介绍WWDG 简介上一章我们已经介绍了IWDG,知道它的工作原理就是一个12 位递减计数器不断递减计数,当减到0 之前还
2021-06-07 11:12:45 2380
原创 18 . 独立看门狗(IWDG)实验
独立看门狗(IWDG)实验我们来学习下STM32F1 的独立看门狗(以下简称IWDG)。STM32F1内部自带了两个看门狗,一个是独立看门狗IWDG,另一个是窗口看门狗WWDG,只介绍独立看门狗IWDG,窗口看门狗WWDG 会在后面介绍。要实现的功能是:通过K_UP 按键进行喂狗,喂狗的时候D2 指示灯点亮,超过喂狗时间产生复位后D2 指示灯熄灭,同时使用D1 指示灯闪烁表示系统运行。分为如下几部分内容:1. IWDG 介绍2. IWDG 配置步骤3. 硬件设计4. 软件设计IWDG 介绍IW
2021-06-07 10:18:39 2662 3
原创 17 . CAN 通讯实验
CAN 通讯实验CAN 介绍CAN 总线介绍CAN 是Controller Area Network 的缩写(以下称为CAN),中文意思是控制器局域网络,是ISO 国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司
2021-05-26 17:46:16 2198 2
原创 16 . USART 串口通信实验
USART 串口通信实验我们知道STM32F1 内部含有非常多的通信接口,我们就来学习下USART 串口通信。要实现的功能是:STM32F1 通过USART1 实现与PC 机对话,STM32F1 的USART1 收到PC 机发来的数据后原封不动的返回给PC 机显示。分为如下几部分内容:通信的基本概念STM32F4 的USART 介绍USART 串口通信配置步骤硬件设计软件设计1 . 通信的基本概念我们知道STM32F1 芯片内含有非常多的通信接口,学习这些通信接口前,我们很有必要了解下通
2021-05-21 18:37:07 6961
原创 15 . PWM 学习实验
PWM 学习实验我们介绍了STM32F1 的通用定时器,使用TIM4 的更新溢出中断控制D2 指示灯闪烁。现在我们来学习如何使用通用定时器产生PWM 输出。本章要实现的功能是:通过TIM3 的通道1 输出PWM 信号,控制D7 指示灯的亮度。分为如下几部分内容:PWM 简介通用定时器PWM输出配置步骤硬件设计软件设计PWM 简介PWM 是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常
2021-05-21 14:43:28 1053
原创 14 . 定时器中断实验
定时器中断实验我们介绍了STM32F1 的外部中断,这一章我们来学习下定时器中断。STM32F1 的定时器功能非常强大,其包含 2 个基本定时器(TIM6、TIM7)、4 个通用定时器(TIM2-TIM5)和2 个高级定时器(TIM1、TIM8),共计8 个, 与51单片机定时器的功能和数量相比优势非常明显。我们以通用定时器为例进行讲解,让大家学会STM32F1 定时器的使用。本章要实现的功能是:通过TIM4 中断控制D2 指示灯闪烁,主函数控制D1 指示灯闪烁。定时器介绍STM32F1 的定时器非
2021-05-17 16:33:10 4034 1
原创 13 . 外部中断实验
外部中断实验介绍了STM32F10x 的中断,就来学习下外部中断。要实现的功能与按键实验一样,即通过按键控制LED,只不过这里采用外部中断方式进行控制。1. 外部中断介绍EXTI 简介STM32F10x 外部中断/事件控制器(EXTI)包含多达20 个用于产生事件/中断请求的边沿检测器。EXTI 的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独立地被屏蔽。EXTI 结构框图EXTI 框图包含了EXTI 最核心内容,掌握了此框图,
2021-05-17 09:57:28 2746 5
原创 12 . 中断
中断介绍中断就是当CPU 执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU 暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程就称为中断,引发中断的称为中断源。比如:看电视时突然门铃响,那么门铃响就相当于中断源。有些中断还能够被其他高优先级的中断所中断,那么这种情况又叫做中断的嵌套。中断示意图如图所示:Crotex-M3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断
2021-05-12 14:03:54 384 1
原创 11 . 蜂鸣器实验介绍
蜂鸣器简介蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V 直流工作电压),多谐振荡器起振,输出1.5~5kHZ 的音频信号,阻抗匹配器推动压电蜂鸣片发声。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等
2021-05-10 14:20:55 7891 1
原创 10 . 定时器介绍和应用
在前面我们使用到的延时是通过CPU 循环等待产生的,这个延时是不精确的。现在给大家介绍STM32F1 内部SysTick 系统定时器,通过一个简单的LED 流水灯程序来讲述如何配置SysTick 系统定时器实现精确延时。分为如下几部分内容: 1. SysTick 定时器介绍 2. SysTick 定时器操作 3. 软件设计 4. 实验现象SysTick 定时器介绍SysTick 定时器也叫SysTick 滴答定时器,它是Cortex-M3 内核的一个外设,被嵌入在NVIC 中。它是一个24 位
2021-05-08 18:23:51 662
原创 8 . STM32固件库介绍
STM32固件库介绍前面为大家简单介绍了如何使用寄存器点亮开发板上LED,这种开发方式显然是不适合大众,对于STM32 这样庞大的芯片,内部寄存器实在太多,如果操作的外设比较多,那么就需要花很多时间查询底层寄存器内容,而且即使程序写好,如果要换其他端口或者外设的话,修改起来非常麻烦,而且容易出错,移植性也差。基于这些原因,ST 公司推出了一套固件库,内部已经将STM32 的全部外设寄存器的控制封装好,给用户提供一些API 函数,用户只需要学习如何使用这些API 函数即可。这里将向大家介绍这套固件库,为后面
2021-04-27 18:25:04 1140
原创 7 . 如何使用寄存器点亮一个LED灯
如何点亮LED本篇讲解用寄存器在stm32 开发板上点亮一个LED灯 , 原理图如下:相同网络标号表示它们是连接在一起的,因此LED1-LED8 发光二极管阴极是连接在STM32 的PC0-PC7 管脚上。如果要使D1 指示灯亮,只需要控制PC0 管脚输出低电平,如果要使D1 指示灯灭,只需控制PC0 输出高电平。对于其他的LED 控制方法一样。我们所要实现的功能是点亮D1 发光二极管,即让STM32 的PC0 管脚输出一个低电平。下面就开始使用寄存器来操作STM32 使PC0 输出一个低电平。要操
2021-04-26 18:04:26 2976
原创 6 . STM32 GPIO介绍
GPIO是什么?GPIO (general purpose intput output) ,是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。不过GPIO 最简单的应用还属点亮LED 灯了,只需通过软件控制GPIO 输出高低电平即可。当然GPIO 还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。STM32引脚的分类如何?那么是不是所有引脚都是GPIO 呢?当然不是,S
2021-04-26 15:20:47 3229 1
原创 5 . 如何用c语言封装寄存器
前面我们介绍了存储器映射、寄存器和寄存器映射,这些都是为使用 C语言封装寄存器做铺垫。我们通过一个实例来对 C 语言封装寄存器进行介绍。**实例 **:控制 GPIOC 端口的第 0 管脚输出一个低电平。首先我们需要知道GPIOC 端口外设是挂接在哪个总线上的,然后根据总线基地址和本身的偏移地址得到 GPIOC 外设基地址,最后通过这个外设基地址得到里面各种寄存器基地址。(1)总线和外设基地址封装根据寄存器的概念,我们可以使用 C 语言中的宏定义对寄存器进行定义。具体代码如下:**//定义外设基地址
2021-04-24 14:10:16 736
原创 4 . 寄存器和存储器的操作
如何访问STM32 寄存器内容我们知道寄存器就是一些有特定功能的内存单元,所以要访问STM32 寄存器也就是操作STM32 的内存单元,根据C 语言指针的特点,可以使用指针来操作STM32 的内存单元。首先介绍两个概念:片内、外设,片内指做成芯片的集成电路内部,简称片内(也称片上),片外同理显而易见;外设是外部设备的简称,是指集成电路芯片外部的设备。集成电路芯片与外部设备的连接一般需要专门的接口电路和总线的连接(包括控制总线路、地址总线和数据总线等)。由于大规模集成电路的技术发展得很快,现在许多芯片在
2021-04-23 14:28:35 1070
原创 3 . 存储器映射 和 寄存器映射
存储器映射程序存储器、数据存储器、寄存器和 I/O 端口排列在同一个顺序的 4 GB 地址空间内。也就是被总线连接的部分。我们在编程的时候,也是对这些功能部件进行操作。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。从图 中我们可以看出 ARM 将这 4GB 的存储器空间,平均分成了 8 块区域,每块区域的大小是 512MB,这个容量是非常大的,因此芯片厂商就在每块容量范围内设计各自特色的外设,要注意一点每块区域容量占用越大
2021-04-22 23:20:48 2437
原创 2 . 可运行最小电路介绍
可运行最小电路介绍在51单片机中 最小电路由 晶振电路,复位电路,电源电路,下载电路 组成,stm32 中也一样!晶振电路: 外部高速(HSE)和外部低速 (LSE)复位电路:stm32是低电平复位,51 是高电平复位电源电路:5v 和 3.3v下载电路:232模块,通过串口下载到系统存储器stm32F1的启动模式 可以通过BOOT[1:0 ] 引脚,选择三种不同启动模式...
2021-04-20 17:16:47 377
原创 C语言之链表
C语言之链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。链表主程序#include <stdio.h>#include<malloc.h>typedef struct node{ int data; struct node * pNext
2021-04-19 17:21:22 185
原创 9 . 时钟系统学习
STM32 时钟树学习记录时钟树介绍在STM32 时钟系统中,有5 个重要的时钟源:分别是LSI、LSE、HSI、HSE、PLL。按照时钟频率分可分为高速时钟源和低速时钟源,在这5 个中HSI,HSE 以及PLL 属于高速时钟,LSI 和LSE 属于低速时钟。按照时钟来源可分为外部时钟源和内部时钟源,外部时钟源就是STM32 晶振管脚处接入外部晶振的方式获取时钟源,其中HSE 和LSE 是外部时钟源,其他的是内部时钟源。HSI 是内部高速时钟,RC 振荡器,频率为8MHz。可作为系统时钟或
2021-04-19 17:19:02 1380
原创 学习记录之 main函数的前世今生
开始执行main函数(1)初始化堆栈指针SP = _initial_sp(2)初始化PC 指针 = Reset_Handler(3)初始化中断向量表(4)配置系统时钟(5)调用C 库函数_main 初始化用户堆栈,从而转向我们用户应用程序的main...
2021-04-09 17:13:18 200
原创 C语言之 如何写好一个循环队列
循环队列循环队列在我们传递数据的过程中经常会用到,相对于直线队列来讲,直线队列在元素出队后,头指针向后移动,导致删除元素后的空间无法在利用,当变成循环队列之后,删除元素后的空间仍然可以利用。声明一块RAM空间#define MAX_SIZE 20static ev_queue[MAX_SIZE] = { 0 };static int ev_front = -1;static int ev_rear = -1;static int ev_size = 0;-判断队列是否为满boolea
2020-12-07 15:44:19 169
原创 C语言之task周期调用技巧
C语言编程技巧提升mcu 中 task的宏定义在使用task分配任务的时候,在不同的周期中会有不同的效果,1ms,2ms,…100ms,如何在调用的时候写的代码更具有移植性,可使用task进行宏定义,
2020-12-03 10:45:28 1351
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人