![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STM32
橘长_
攻城狮
展开
-
MultiTimer链表分析
#include "MultiTimer.h"#include <stdio.h>/* Timer handle list head. */static MultiTimer* timerList = NULL;/* Timer tick */static PlatformTicksFunction_t platformTicksFunction = NULL;int MultiTimerInstall(PlatformTicksFunction_t ticksFunc){原创 2022-04-09 00:21:54 · 507 阅读 · 0 评论 -
ucosii移植
放到文件夹├─Cfg│ app_cfg.h│ app_hooks.c│ os_cfg.h│├─Ports│ os_cpu.h│ os_cpu_a.asm│ os_cpu_c.c│ os_dbg.c│└─Source os.h os_core.c os_dbg_r.c os_flag.c os_mbox.c os_mem.原创 2022-04-05 20:04:00 · 352 阅读 · 0 评论 -
HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)
/*以STM32F407为例子,为什么参数是这个0. (SystemCoreClock / (1000U / uwTickFreq)): (表示systick的reload value)1. SystemCoreClock 系统时钟 168000000: (1s可以计数这么多)2. (1000U / uwTickFreq): (将1s分成1000份即1ms, 所以uwTickFreq毫秒后,触发systick中断)*/HAL_SYSTICK_Config(SystemCoreClock / (1原创 2022-04-05 02:37:14 · 3011 阅读 · 0 评论 -
SPI通信
SPI特性SPI总线包括4条逻辑线,定义如下:MISO:Master input slave output 主机输入,从机输出(数据来自从机);MOSI:Master output slave input 主机输出,从机输入(数据来自主机);SCLK :Serial Clock 串行时钟信号,由主机产生发送给从机;SS:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。时钟极性 CKP/Clock Polarity除了配置串行时钟速率(频率)外,S原创 2021-11-23 09:16:20 · 248 阅读 · 0 评论 -
单片机开发格式化文件
*.c/* Includes ------------------------------------------------------------------*//* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Privat原创 2021-11-22 22:49:31 · 290 阅读 · 0 评论 -
(二)STM32HAL库LED灯
配置三个灯为例三个灯亮灯电平都为低电平bsp_led.h/* LED assign LD1 : PG13 (低电平点亮,高电平熄灭) LD2 : PG14 (低电平点亮,高电平熄灭) LD3 : PG15 (低电平点亮,高电平熄灭)*/#define LEDn 3#define LED1_PIN GPIO_PIN_13#defin原创 2021-11-17 23:15:27 · 368 阅读 · 0 评论 -
(一)STM32HAL库时钟配置
一 原理图外部晶振8M二 手册时钟图官方提供的代码/* STM32H407 HAL 库初始化,此时系统用的还是F407自带的16MHz,HSI时钟: - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。 - 设置NVIV优先级分组为4。*/ HAL_Init();/* 配置系统时钟到168MHz - 切换使用HSE。 - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。*/SystemClock_Config();原创 2021-11-17 23:12:28 · 3075 阅读 · 0 评论 -
STM32堆栈
栈得基本操作uint32_t a = 0; //全局初始化区, 可以被其他 c 文件 extern 引用static uint32_t ss = 0; //静态变量,只允许在本文件使用uint8_t *p1; //全局未初始化区int main(void){uint32_t b; //栈uint8_t s[] = "abc"; //栈uint8_t *p2; //栈uint8_t *p3 = "123456"; //123456\0 在常量区, p3 在栈上。static uint3.原创 2021-11-04 20:25:50 · 285 阅读 · 0 评论 -
clion调试Messages乱码
Help -> Edit Custom VM option…追加-Dconsole.encoding=UTF-8-Dfile.encoding=UTF-8重启clion原创 2021-08-29 22:28:33 · 842 阅读 · 4 评论 -
vscode cortex-debug openocd stm32配置
环境变量安装mingwgcc -vmingw32-make -v这里可以到bin目录下将mingw32-make.exe改名为make.exe安装arm gcc toolchainarm-none-eabi-gcc -vc安装openocdopenocd -vvscode插件安装C/C++ARMCortex-DebugCortex-Debug: Device Support Pack - STM32F4配置Ctrl+Shift+Pc_cpp_properti原创 2021-08-26 23:56:31 · 3311 阅读 · 2 评论 -
NUCLEO-F401RE
LEDSB21导通时,LED LD2 与Arduino D13连接D13对应PA5UART2使用D0 D1 SB13 and SB14 must be OFFButton原创 2021-08-25 18:48:12 · 477 阅读 · 0 评论 -
按键FIFO
/* * @Author: John Luo * @Date: 2021-08-25 10:54:28 * @LastEditTime: 2021-08-25 13:01:24 * @LastEditors: John Luo * @Description: 1. 自定义IsKeyDown()函数 * 2. gp_InitKeyVar()赋值函数指针 * 3. 连按功能需要打开长按功能 * @FilePath: \61F14x_UART原创 2021-08-25 13:03:06 · 373 阅读 · 1 评论 -
stm32软件定时器
/* 在此定义若干个软件定时器全局变量 注意,必须增加__IO 即 volatile,因为这个变量在中断和主程序中同时被访问,有可能造成编译器错误优化。*/#define TMR_COUNT 4 /* 软件定时器的个数 (定时器ID范围 0 - 3) *//* 定时器结构体,成员变量必须是 volatile, 否则C编译器优化时可能有问题 */typedef enum{ TMR_ONCE_MODE = 0, /* 一次工作模式 */ TMR_AUTO_MODE = 1 /* 自动定原创 2021-08-23 10:03:56 · 1081 阅读 · 0 评论 -
stm32串口发送重定义支持GNUC
在uart.c文件下添加/* USER CODE BEGIN 1 */#ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else #define PUT原创 2021-08-18 23:02:49 · 284 阅读 · 0 评论 -
单片机强制类型转换与内存的关系
uint32_t fdata[2] = {0x87654321,0x5fedcba9}; uint64_t f64data = *(uint64_t *)fdata; uint8_t d0 = f64data & 0xFF; uint8_t d1 = (f64data>>8) & 0xFF; uint8_t d2 = (f64data>>16) & 0xFF; uint8_t d3 = (f64data...原创 2021-03-07 15:35:30 · 704 阅读 · 0 评论 -
stm32cubemx+clion环境搭建
title: stm32cubemx+clion环境搭建date: 2021-01-23 13:32:05tags: 环境搭建cover: https://s3.ax1x.com/2021/01/23/s7unQx.png为什么搭建需要找到一个keil的替代品用来编译STM32代码。环境和所需工具软件环境1. Windows 102. stm32cubemx3. clion-20194. MinGW5. arm-none-eabi-gcc6. openOCD硬件环境1. 单.原创 2021-03-06 12:32:48 · 1610 阅读 · 2 评论 -
rtthread优先级的实现
title: rtthread优先级的实现date: 2020-10-22 17:42:59tags: rtthread就绪列表RT-Thread 要支持多优先级,需要靠就绪列表的支持,从代码上看,就绪列表由两个在 scheduler.c 文件定义的全局变量组成,一个是线程就绪优先级组rt_thread_ready_priority_group,另一个是线程优先级表rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]。将线程插入到线程优先级表,如图:.原创 2020-12-17 22:43:18 · 2085 阅读 · 1 评论 -
rtthread线程定义与切换实现
title: rtthread线程定义与切换实现date: 2020-10-22 12:39:15tags: rtthread创建线程包括:线程栈大小、线程栈、线程函数、线程控制块定义线程栈在多线程系统中,每个线程都是独立的,互不干扰的,所以要为每个线程都分配独立的栈空间,这个栈空间通常是一个预先定义好的全局数组,也可以是动态分配的一段内存空间,但它们都存在于 RAM 中。定义线程栈线程栈即rt_uint8_t类型数组ALIGN(RT_ALIGN_SIZE)/* 定义线程栈 */r.原创 2020-12-17 22:42:47 · 4058 阅读 · 0 评论 -
rtthread临界段的保护
title: rtthread临界段的保护date: 2020-10-22 15:29:49tags: rtthread临界段用一句话概括就是一段在执行的时候不能被中断的代码段。Cortex-M 内核快速关中断指令CPSID I ;PRIMASK=1 ;关中断CPSIE I ;PRIMASK=0 ;开中断CPSID F ;FAULTMASK=1 ;关异常CPSIE F ;FAULTMASK=0 ;开异常PRIMASK 和 FAULTMAST 是 Cortex-M 内核 里面三个中.原创 2020-12-17 22:42:10 · 839 阅读 · 0 评论 -
rtthread空闲线程与阻塞延时的实现
title: rtthread空闲线程与阻塞延时的实现date: 2020-10-22 17:04:45tags: rtthreadRTOS 中的延时叫阻塞延时,即线程需要延时的时候,线程会放弃 CPU 的使用权,CPU 可以去干其它的事情,当线程延时时间到,重新获取 CPU 使用权,线程继续运行,这样就充分地利用了 CPU 的资源,而不是干等着。如果没有其它线程可以运行,RTOS 都会为 CPU 创建一个空闲线程,这个时候 CPU 就运行空闲线程,且空闲线程的优先级最低。空闲线程在idl.原创 2020-12-17 22:41:33 · 3176 阅读 · 0 评论 -
rtthread对象容器的实现
title: rtthread对象容器的实现date: 2020-10-22 15:50:29tags: rtthread在 RT-Thread 中,所有的数据结构都称之为对象。对象对象枚举定义中线程,信号量,互斥量、事件、邮箱、消息队列、内存堆、内存池、设备和定时器在 rtdef.h 中有明显的枚举定义。rtdef.h/** * 对象类型由下面的宏来使能,这些宏通常在rtconfig.h中定义 * - Thread * - Semaphore * - Mutex *.原创 2020-12-17 22:40:57 · 650 阅读 · 0 评论 -
rtthread定时器的实现
title: rtthread定时器的实现date: 2020-10-25 15:57:01tags: rtthread每当线程需要延时的时候,就初始化 remaining_tick 需要延时的时间,然后将线程挂起,这里的挂起只是将线程在线程就绪优先级组中对应的位清 0,并不会将线程从线程优先级表(即就绪列表)中删除。当每次时基中断(SysTick 中断)来临时,就扫描就绪列表中的每个线程的 remaining_tick,如果 remaining_tick 大于 0 则递减一次,然后判断 rem.原创 2020-12-17 22:40:24 · 2075 阅读 · 0 评论 -
STM32CubeMX新建helloworld
1 设置与下载固件包2 配置rcc和sys3 外设4 生成代码配置代码部分// main.c while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); printf("hello world!"); HAL_Delay(50); } /* USER CODE END 3 */}---原创 2020-09-20 15:17:34 · 888 阅读 · 0 评论 -
STM32F407串口485+DMA接收不定长数据
这是项目里用到一个传感器需要通过485通信,单片机发送请求指令,传感器回应一个不定长数据,之前的串口接收是通过判断延时10ms没有接收到数据算是完成了一帧数据的接收,这种做法的缺点很多。所以重新写了一个通过串口空闲中断加DMA传输的方式接受数据。硬件:stm32F407固件库:stm32标准库_V1.4串口3驱动代码串口开启空闲中断串口开启DMA传输...原创 2020-08-14 17:37:53 · 2737 阅读 · 0 评论 -
stm32实用的代码
// countof(a) 算出字符的长度 uint8_t TxBuffer[] = "Buffer Send from USART1";#define TxBufferSize (countof(TxBuffer))#define countof(a) (sizeof(a) / sizeof(*(a)))原创 2020-03-03 15:14:17 · 962 阅读 · 0 评论 -
stm32F407按键例程安富莱
/************************************************************************************************************ 模块名称 : 独立按键驱动模块 (外部输入IO)* 文件名称 : bsp_key.c* 版 本 : V1.3* 说 明 : 扫描独立按键,具有软件滤波机制,...原创 2020-02-27 15:08:51 · 2151 阅读 · 0 评论 -
STM32简单的PID控制器代码
/**************************************************************************函数功能:位置式PID控制器入口参数:编码器测量位置信息,目标位置返回 值:电机PWM根据位置式离散PID公式 pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]e(k)代表本次偏差 e(k-1)代表上一次的偏差...原创 2020-02-03 14:17:49 · 6399 阅读 · 0 评论 -
串口打印调试信息(干货)
printf重定向到串口上代码,这里用到的是hal库,标准库改以下函数就行。#include <stdio.h>int fputc(int ch, FILE *f){ uint8_t temp[1] = {ch}; HAL_UART_Transmit(&huart1, temp, 1, 5); //huart1需要根据实际配置 return ch;}in...原创 2019-10-26 19:40:40 · 9094 阅读 · 2 评论 -
STM32f103c8t6的定时器配置定时中断
//时间计算公式Tout = ((arr+1)*(psc+1))/Tclk ;其中: Tclk:定时器的输入时钟频率(单位MHZ) Tout:定时器溢出时间(单位为us) .TIM_Period = arr; eg;4999 .TIM_Prescaler = psc; eg:7199 Tout = ((4999+1)×(7199+1))...原创 2020-02-02 20:41:22 · 12922 阅读 · 4 评论 -
stm中断优先级理解+抢占优先级和相应优先级
1、抢占优先级比子优先级的优先权更高,这意味抢占优先级更高的中断会先执行,而不管子优先级的优先权,数值越低优先级越高。2、同理,如果抢占优先级相同,那么就会比较子优先级,子优先级更高的中断将会先被执行,数值越低优先级越高...转载 2019-07-21 13:11:08 · 10490 阅读 · 0 评论 -
STM32启动文件详解(stm32f4xx)
1、启动文件简介初始化堆栈指针 SP=_initial_sp初始化 PC 指针=Reset_Handler初始化中断向量表配置系统时钟调用 C 库函数_main 初始化用户堆栈,从而最终调用 main 函数去到 C 的世界Set the initial SPSet the initial PC == Reset_HandlerSet the vector table ent...原创 2019-07-19 13:23:17 · 4634 阅读 · 0 评论