FreeRTOS_移植
FreeRTOS(0)移植1.在文件根目录下创建Freertos文件夹,把源码拷贝 2.在Keil中创建三个文件夹,分别添加.c和.h 其中port.c 如果用的编译器version5,从RVDS文件夹添加。如果用的version 6,从GCC添加 头文件只用选3个文件夹 3.由于命名冲突,注释掉stm32f4xx_it.c中 void SVC_Handler(void) void PendSV_Handler(void)这两个函数 4.修改systic_Handler函数 12345678910111213void SysTick_Handler(void){ /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); /* USER CODE BEGIN SysTick_IRQn 1 */ ...
FreeRTOS_常用API
FreeRTOS(3)常用API==FreeRTOS中任务优先级数值越大,优先级越高,和HAL库相反== 1.创建任务1234567891011121314BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //任务函数 const char * const pcName, //任务名字 const uint16_t usStackDepth, //任务堆栈大小 void * const pvParameters, //传递给任务函数的参数 UBaseType_t uxPriority, //任务优先级 TaskHandle_t * const pxCreatedTask ) //任务句柄//pxTaskCode : 任务函数 //PCName :...
面试题
...
08 STM32
STM321.系统架构STM32F4系列的系统架构如图所示(来自User Manual): 可以看到内核通过3条总线连接到AHB(Advanced High-performance Bus)总线矩阵,然后与各个外设、Flash和SRAM连接 Data Sheet里面也有个比较好的架构图: 内核总线ARM Cortex-M系列的CPU都包含以下3条总线: I-Bus:指令总线,负责在 0x0000_0000 – 0x1FFF_FFFF 之间的取指操作,访问的存储器对象是Flash D-Bus:数据总线,负责在 0x0000_0000 – 0x1FFF_FFFF 之间的数据访问操作,访问的存储器对象是Flash S-Bus:系统总线,负责在 0x2000_0000 – 0xDFFF_FFFF 和 0xE010_0000 – 0xFFFF_FFFF 之间的所有数据传送,取指和数据访问都算上,访问对象是SRAM和外设寄存器 不同内核实际上各个总线能访问的地址范围不一样 参考: Cortex-M3权威指南第六章 STM32 User Manual 2.内存映射ARM...
ADC
HAL库ADC1.硬件问题STM32的ADC、DAC的供电电源是VDDA,直接把他连到VDD上就行了,千万别加电阻。 ADC的测量范围是:0~VDDA,如果加了电阻,则VDDA会小于3.3V,那么ADC的量程也将缩小。 2.软件问题ADC和串口一样,每次读取前都得开启一次,不然就只能读一次 12345678910111213uint16_t get_adc(void){ //开启ADC1 HAL_ADC_Start(&hadc1); //等待ADC转换完成,超时为100ms HAL_ADC_PollForConversion(&hadc1,100); //判断ADC是否转换成功 if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)) { return HAL_ADC_GetValue(&hadc1); } return...
旅游机器人赛后总结
旅游机器人赛后总结1.硬件介绍1.主控:STM32F103ZET6 2.用到的传感器: a.8路灰度传感器 b.光电传感器 c.MPU6050 d.色标传感器 3.小车结构: ...
电赛赛后总结
电赛赛后总结 本次电赛采用MSP430F5529作为主控,做了2台寻迹小车。最后评测时并没能实现之前已经调好的功能,主要原因我认为是评测场地和学校的场地摩擦力还是差别有点大,导致主车在第三问转到内圈时转不过去。之前从车速度调高了之后老是跑出黑线外,在评测这边却没有出现该问题,导致从车会跟主车的距离过近。 虽然结果一般,但是我还是学到了一些东西: 1.传感器采集数据我之前那种宏定义的方法不太好,会多次重复读取,读取一次把各个传感器的数据放到一个数组里,再把该数组宏定义会更好。 2.寻迹的PID不一定只要P,可以加上D,会加速调整。 3.传感器采集数据可以不放在while1里,而放在一个ms级别的定时器中断内,这样可以保证采样周期一直不变。 4.尽量所有环节都闭环,如果最后那个主车用的是灰度的转弯办法应该就可以到内圈了…
FreeRTOS_任务状态
FreeRTOS(2)任务状态除了运行状态之外的状态统称为非运行状态。因为 FreeRTOS 是为单CPU设计的系统,在任何时刻最多只能允许一个任务处在运行状态,哪怕看起来好像有多个任务同时在运行——这只是多个任务不停地切换带来的效果。当一个任务从运行状态切换到非运行状态时,执行时的现场——CPU寄存器被保存在任务的私有堆栈中;在重新回到运行状态时,再从堆栈中恢复之间保存的寄存器。这是任务调度的最基本功能。 1.就绪的任务 ==FreeRTOS 任务的就绪状态表示任务目前没有被执行,但随时可以被执行。当下一次任务切换时机到来时,FreeRTOS 将从就绪任务的列表中选择优先级最高的任务,切换成运行状态。== 任务优先级是任务的一个属性,FreeRTOS 用整型数表示优先级,最低优先级为0, 最高为 configMAX_PRIORITIES 宏定义的值减去1. 创建任务的时候需要指定一个优先级,在创建之后也可以再通过 vTaskPrioritySet()...
FreeRTOS_信号量
FreeRTOS(4)信号量 信号量API函数实际上都是宏,它使用现有的队列机制。这些宏定义在semphr.h文件中。如果使用信号量或者互斥量,需要包含semphr.h头文件。 一、创建信号量 ==二进制信号量==创建实际上是直接使用通用队列创建函数xQueueGenericCreate()。创建二进制信号量API接口实际上是一个宏,定义如下: 123456789#define xSemaphoreCreateBinary() \ xQueueGenericCreate( \ ( UBaseType_t ) 1, \ semSEMAPHORE_QUEUE_ITEM_LENGTH, \ NULL, \ NULL, \ ...
FreeRTOS_命名规则
FreeRTOS(1)命名规则1. 命名规则RTOS内核和演示例程源代码使用以下规则: > 变量uint32_t:前缀 ul,u 表示 unsigned,l 表示 long uint16_t:前缀 us,s 表示 short uint8_t:前缀 uc,c 表示 char 非 stdint 类型的变量使用前缀 x,比如基本的 Type_t 和 TickType_t 类型 非 stdint 类型的无符号变量使用前缀 ux,比如 UbaseType_t(unsigned BaseType_t) size_t 类型的变量使用前缀 x 枚举类型变量使用前缀 e 指针类型变量在类型基础上附加前缀 p,比如指向 uint16_t 的指针变量前缀为 pus char 类型变量前缀为 c char * 类型变量前缀为 pc 举例: 12size_t xQueueSizeInBytes;uint8_t * pucQueueStorage; > 函数在文件作用域范围的函数前缀为 prv(一般定义是 static) API 函数的前缀为它们的返回类型,当返回为空时,前缀为...