IIC
IIC1.IIC的地址问题 IIC中的器件地址DEV_ADDRESS是7位地址,但C语言中没有7bit的数据类型,所以你只能传uint8_t的数据进去。HAL库会把这个变量的高7位提取出来作为地址,根据实际情况对最后一个读写位set或reset。 通常数据手册在表述地址的时候,地址是在一个8位二进制数的低7位,比如6050就是0x68=0110 1000,但HAL库IIC传进去的地址在一个8位二进制数的高7位,就变成了0xD0(写)或者0xD1(读)这点要注意。 HAL库你在传地址的时候不需要自己考虑第8位是0还是1,它那个函数内部会自动根据你调用的是IIC读还是IIC写来对那一位进行运算。不过你要是非要传第8位已经写0或1的地址进去也行,因为运算结果不会变,只要你不写反就行了 2. IIC的数据传输IIC一般根据从机寄存器的位数来确定一次传几个字节的数据。通过以下函数中的 Size参数可以设定传输数据的字节数 12345HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,...
LVGL基础
LVGL基础1.对象(1)概述在 LVGL 中,用户界面的基本构建块是对象,也称为 Widgets。 例如 button、label、image。lsit….. 所有的对象都使用lv_obj_t这个类型的指针作为句柄(类似于C++中的Base),通过该指针来获取对象的各种信息 (2)对象的属性对象的属性包括:基本属性、特定属性 所有对象类型共享一些基本属性: 位置 尺寸 parent 样式 事件处理程序 等等 您可以使用 lv_obj_set_... 和 lv_obj_get_... 函数设置/获取这些属性 对象类型也有特殊的属性。例如,一个滑块有 最小值和最大值 当前值 对于这些特殊的属性,每个对象类型都可能有唯一的 API 函数。例如对于滑块 lv_slider_set_range(slider1, 0, 100); (3)工作机制父对象可以被视为其子对象的容器。每个对象只有一个父对象(屏幕除外),但一个父对象可以有任意数量的子对象。 如果父节点的位置发生变化,子节点将与父节点一起移动。...
SysTick详解
SysTick详解SysTick定时器简介SysTick定时器也叫SysTick滴答定时器,它是Cortex内核的一个外设,被嵌入在NVIC中。它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取。当定时器计数到0时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。因此只要知道计数的次数就可以准确得到它的延时时间。 SysTick定时器作为HAL_Delay的基准在cube生成的代码中,main函数中HAL_RCC_ClockConfig();初始化系统时钟的时候Systick被初始化。初始化时,Cube默认设置Systick中断优先级为最高优先级,中断周期由函数HAL_SYSTICK_Config(SystemCoreClock / (1000U /...
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.main.cpp和CUBE生成的main.c分开放,在main.cpp中定义用户函数Main(),放到main.c的main()中。这样即使CUBE再生成也不会覆盖了。 2.稚晖君在Main()中做了如下的事情: Main(){电机:绑定驱动、编码器、初始化按键:绑定回调函数开启定时器主循环} 3.在main.cpp中,它还定义了一堆定时器的Event Callbacks,按键回调函数的实现。 4.定时器中断函数不要直接写在Cube给我们定义的接口中,可以自己定一个函数,比如Tim1Callback100Hz(),然后把这个函数放进定时器的IRQHandler中调用就行了,比较直观。 5.如果一个类需要定时器作为时间基准,那么就定义.Tick()函数,并放到定时器的回调函数中。然后在类中定义_Elapsedtime这个变量记录时间。 Tick函数的内容一般就是:给类中的_Elapsedtime变量加时间;如果涉及状态机,则在Tick()里面更新状态,并调用回调函数。手表的PageManager类就是这样的。
电赛赛后总结
电赛赛后总结 本次电赛采用MSP430F5529作为主控,做了2台寻迹小车。最后评测时并没能实现之前已经调好的功能,主要原因我认为是评测场地和学校的场地摩擦力还是差别有点大,导致主车在第三问转到内圈时转不过去。之前从车速度调高了之后老是跑出黑线外,在评测这边却没有出现该问题,导致从车会跟主车的距离过近。 虽然结果一般,但是我还是学到了一些东西: 1.传感器采集数据我之前那种宏定义的方法不太好,会多次重复读取,读取一次把各个传感器的数据放到一个数组里,再把该数组宏定义会更好。 2.寻迹的PID不一定只要P,可以加上D,会加速调整。 3.传感器采集数据可以不放在while1里,而放在一个ms级别的定时器中断内,这样可以保证采样周期一直不变。 4.尽量所有环节都闭环,如果最后那个主车用的是灰度的转弯办法应该就可以到内圈了…
串口通信进制问题
串口通信进制问题由于UART一般通信帧是8 bit,所以通常以ASIIC码的形式进行传输,但也可以用一位16进制数来进行传输。 常见的串口助手默认发送的都是字符型比如’5’,或者说ASIIC码的形式,如果要发送16进制数,需要选择16进制发送,比如要发0xFF,串口助手这里发送写成FF就行,但单片机的的if中必须写成0XFF Python发送16进制数先用bytearry打包,然后serial.write就行了
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 函数的前缀为它们的返回类型,当返回为空时,前缀为...
事件
事件当LVGL发生某些用户可能感兴趣的事件时,系统做出相应的响应。实际上根据具体情况调用相应的回调函数。STM32的中断也可看成是一种事件 LVGL中的事件包括以下几类: 输入设备事件(Input device events):对象被按下、滚动、聚焦…. 绘图事件(Drawing events) 其他事件(Special events):对象被删除、样式等被更改….. 特殊事件(Other events):对象的值被更改(滑块移动)、一个过程完成 自定义事件(Custom events) 具体的看官方文档 1.给对象添加事件1234567static void my_event_cb(lv_event_t * event){ printf("Clicked\n");}lv_obj_t * btn = lv_btn_creae(lv_scr_act());lv_obj_add_event_cb(btn, my_event_cb, LV_EVENT_CLICKED, NULL); /*Assign an event...
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 :...







