STM32CubeMX學習教程之七:ADC讀取電壓並輸出到串列埠
完整原始碼下載:https://github.com/simonliu009/STM32CubeMX-ADC
軟體:
STM32CubeMX V4.25.0
System Workbench V2.4
韌體庫版本:
STM32Cube FW_F1 V1.6.1
硬體:
OneNet 麒麟座V2.3
在STM32CubeMX中新建專案,選擇正確的MCU型號
首先設定RCC和SYS,如下圖
配置USART1為Asychronous模式UART1配置用預設的115200,8, None和1就好。
然後設定PA6引腳為ADC2_IN6, 完整引腳配置如下圖:
然後根據板子實際情況設定時鐘(麒麟座外部晶振是12M,STM32F103x的最高主頻是72M),注意CubeMX可能會自動把ADC預分頻係數設為6。
ADC2設定如下
Project - setting ,ToolChain/IDE選擇 SW4STM32
勾選這裡
儲存以後,點選工作列的生成程式碼圖示
生成完畢以後在彈出的對話方塊點選"Open Project", System Workbench自動開啟Eclipse並匯入和打開了專案。
參考上一篇文章的printf()重定向到串列埠的程式碼,編輯main.c, 新增如下程式碼
/* Private function prototypes -----------------------------------------------*/ #ifdef __GNUC__ /* With GCC, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ /* Private functions -------------------------------------------------
/* USER CODE BEGIN 0 */
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
然後修改main.c,新增一個變數儲存ADC的值
/* USER CODE BEGIN 1 */
uint16_t ADC2_Value;
/* USER CODE END 1 */
輸出內容:
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_ADC_Start(&hadc2); HAL_ADC_PollForConversion(&hadc2, 50); if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2), HAL_ADC_STATE_REG_EOC)) { ADC2_Value = HAL_ADC_GetValue(&hadc2); printf("ADC2 Reading : %d \r\n",ADC2_Value); printf("PA6 Voltage : %.4f \r\n",ADC2_Value*3.3f/4096); printf("\r\n"); } HAL_Delay(1000); }
注意這裡printf()輸出浮點數%.4f會提示錯誤:
The float formatting support (-u _printf_float) is not enabled from linker flags
所以需要在這裡新增一個-u _printf_float:
project properties > C/C++ Build > Settings > Tool Settings (TAB) > MCU GCC Linker > Miscellaneous > Linker flags
在把-specs=nosys.specs -specs=nano.specs 改為 -specs=nosys.specs -specs=nano.specs -u _printf_float最後,不要忘記把STM32Cube_FW_F1_V1.6.0\Projects\STM3210C_EVAL\Examples\UART\UART_Printf\syscalls.c 檔案複製到src目錄,很多教程沒有提到這點。如果不復制這個檔案,那麼printf()是不起作用的。
然後右鍵點選專案,選擇Properties, Run-Debug Settings, 點選右側的New,在彈出對話方塊中選擇Ac6 STM32 Debugging。
然後工作列上點選Run圖,當然會報錯的,原因請檢視另一篇我的部落格(https://blog.csdn.net/toopoo/article/details/79680323),所以需要右鍵點選 專案名Run.cfg ,給它改個名字,
然後右鍵點選專案樹裡面的專案名稱,選擇“Propeties”,然後在Run/Debug Settings-選擇專案名-Edit-Main-C/C++Application那裡點選“Search Project”,然後選擇出現的預設的elf檔案:
然後在Debugger-User Defined-Browse 那裡選擇你自己改名的配置檔案:
然後右鍵點選那個新的cfg檔案,選擇"Open With - Text Editor", 進行如下更改:
source [find interface/stlink.cfg] 更改為 source [find interface/stlink-v2.cfg]
reset_config srst_only srst_nogate connect_assert_srst 這一行改為 reset_config none
然後再Run一下,就可以了。
然後使用串列埠程式,波特率設為115200,就可以看到如下這些資訊:
ADC2 Reading : 1646
PA6 Voltage : 1.3261
ADC2 Reading : 1559
PA6 Voltage : 1.2560
ADC2 Reading : 3217
PA6 Voltage : 2.5918
ADC2 Reading : 3325
PA6 Voltage : 2.6788
ADC2 Reading : 1627
PA6 Voltage : 1.3108
ADC2 Reading : 1587
PA6 Voltage : 1.2786
ADC2 Reading : 3221
PA6 Voltage : 2.5950
ADC2 Reading : 2663
PA6 Voltage : 2.1455