注:因工作原因不定时跳票,因能力原因请大家不要做过多期待。
首先从STMCU上下载STM32L053的固件库,然后将它放在CUBEMX的库目录下(不准备使用cubemx的同学可以忽略此步),然后打开目录。
截图截毁了,我们继续打开。
打开后
第一个applications里是一些应用级别的例程,包括FATFS,FREERTOS,以及USB,我们打开FREERTOS这个文件夹 我们可以打开low power这个文件夹,打开例程,编译并下载。
在介绍里我们可以看到,例程创建了两个线程,一个用来接受,一个用来发送。 接受线程等待数据并阻塞队列,发送线程每500ms进入一次阻塞状态。在退出阻塞状态后发送一个数值,接受状态等待这个数值并闪烁led。 而在有限的阻塞状态中,允许内核停止滴答定时器并进入睡眠模式,在最低的低功耗模式下仍然允许CPU保持ram状态(表示不信)
在这个例程中,CPU将无用的io引脚配置成了模拟模式,这有利于降低功耗。 readme中说明CPU每500ms退出一次低功耗模式,然后打开led,然后进入低功耗模式,20ms后退出低功耗模式并关闭led。
然后我们来看看代码。 //启动hal HAL_Init();
//配置时钟 /* Configure the System clock to 2 MHz */ SystemClock_Config();
//将无用IO引脚配置为模拟模式 /* Configure GPIO's to AN to reduce power consumption */ GPIO_ConfigAN();
//配置LED引脚 /* Initialize LED */ BSP_LED_Init(LED2);
//以下是FREERTOS核心代码 //创建一个消息队列
/* Create the queue used by the two threads */ osMessageQDef(osqueue, QUEUE_LENGTH, uint16_t); osQueue = osMessageCreate(osMessageQ(osqueue), NULL);
//创建两个线程 /* Note the Tx has a lower priority than the Rx when the threads are spawned. */ //第一个参数为线程名,第二个为线程要执行的函数,第三个是优先级 osThreadDef(RxThread, QueueReceiveThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE); osThreadCreate(osThread(RxThread), NULL);
osThreadDef(TxThread, QueueSendThread, osPriorityBelowNormal, 0, configMINIMAL_STACK_SIZE); osThreadCreate(osThread(TxThread), NULL);
//启动内核 /* Start scheduler */ osKernelStart();
接着我们来看下发送线程要执行的函数
static void QueueSendThread(const void *argument) {
for (;;)
{
/* Place this thread into the blocked state until it is time to run again.
The kernel will place the MCU into the Retention low power sleep state when the idle thread next runs. */
osDelay(TX_DELAY);
/* Send to the queue - causing the queue receive thread to flash its LED.
It should not be necessary to block on the queue send because the Rx
thread will already have removed the last queued item. */
osMessagePut(osQueue, (uint32_t)QUEUED_VALUE, 0);
} }我们可以看到,发送线程只是延时500ms然后发送一个数据到消息队列
而接收线程执行的函数
static void QueueReceiveThread(const void *argument)
{
osEvent event;
for (;;) { /* Wait until something arrives in the queue. */
event = osMessageGet(osQueue, osWaitForever);
/* To get here something must have arrived, but is it the expected value? If it is, turn the LED on for a short while. */
if (event.status == osEventMessage)
{ if (event.value.v == QUEUED_VALUE) { BSP_LED_On(LED2); osDelay(LED_TOGGLE_DELAY); BSP_LED_Off(LED2); } } } } 在这个函数里,创建一个事件,并在超时后检测队列是否接收到数据并处理底下是关于低功耗的配置,此处不做过多接受(楼主还没看过hal库的低功耗,原来用过标准库),关于低功耗函数的开启也在底下的函数里调用。