LL APIについてはYKb::Logさんの「STM32でLL APIを使ってみる」を参考にしました。
- mbed-cli Version: 1.9.1
- STM32CubeMX Version: 5.1.0
- System Workbench for STM32 - C/C++ Embedded Development Tools for MCU Version: 2.7.2.201812190825
mbed OS5
#include "mbed.h" DigitalOut CheckPin1(D2); int main() { while (true) { CheckPin1 = 1; CheckPin1 = 0; } }
HAL API(一部)
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(CHK1_GPIO_Port, CHK1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(CHK1_GPIO_Port, CHK1_Pin, GPIO_PIN_RESET); } /* USER CODE END 3 */
LL API(一部)
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ LL_GPIO_SetOutputPin(CHK1_GPIO_Port, CHK1_Pin); LL_GPIO_ResetOutputPin(CHK1_GPIO_Port, CHK1_Pin); } /* USER CODE END 3 */
STM32CubeMXで、GPIOの「Maximum ouput speed」を「Very High」に設定。
ソースコードの「static void MX_GPIO_Init(void)」に反映されます。
/*Configure GPIO pin : CHK1_Pin */ GPIO_InitStruct.Pin = CHK1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // <- Here HAL_GPIO_Init(CHK1_GPIO_Port, &GPIO_InitStruct);
LL APIはプロジェクト全体をLL APIにしなきゃいけないかと思っていましたが、HALと混在できるようです。LL APIを使用するには、STM32CubeMXの「Project Manager」-「Advanced Setting」でDriverごとに個別に設定できます。
mbed OS5
HAL API
LL API
- | 処理時間(us) | clock数 |
---|---|---|
mbed OS5 | 61.09 | 11.0 |
HAL API | 126.6 | 22.8 |
LL API | 59.67 | 10.7 |
※クロック数はMPUの駆動クロックの180MHzをオシロの表示値で割って求めました。
LL APIを使ってやっとmbed OS5と同じ程度の処理時間になりました。LL APIの波形を見るとHよりLの時間が長くなっています。これはwhile()ループの処理がオーバーヘッドとなっているためだと思いますが、mbedの場合はそのような兆候は見られません。
いやはや、mbedの処理速度はあっぱれだと思います。
0 件のコメント:
コメントを投稿