STM32 智慧小車 藍芽控制-開發環境搭建
keil MDK5搭建STM32開發環境
keil5下載stm32程式方法
keil uVersion4的安裝解除安裝+破解
先安裝c51的程式,
下載適合自己版本的下載MDK-ARM並安裝;
可自行到官網,下載安裝;(注意需要註冊)
或者在此網站下載,安裝
百度網盤:
安裝完可在Keil uVision5內開啟;
安裝適合自己模組的庫;
安裝完成後;
安裝完關閉,返回Keil uVision5,開啟license management,複製CID;
開啟註冊機,貼上CID,根據自己開發需求選擇Target,本例STM32選 ARM;如果是進行51微控制器開發,選擇C51。
拷貝該許可編碼,回到Keil軟體的License Managerment頁面,在“New License ID Code(LIC)”地方,輸入剛剛拷貝的許可編碼,點選“ADD LIC”按扭;
此時,底下會出現“LIC Added Successfully”提示,表示已經破解成功。
keil軟體新建工程
新建專案
選擇 project 目錄, 選擇STMicroelectronics,選擇對應的使用的STM晶片,我們小車用的是STM32F103C8這個晶片,然後我們點選OK;
下一步會出現執行環境管理器視窗,這是通過選項配置需要的官方庫;
CMSIS -> CORE 必選
Device -> Startup 必選
如果要啟用GPIO,則選擇 STM32Cube HAL -> GPIO,會出現如下情況:
黃色 代表需要依賴其他庫,會在下方提示需要的庫,單擊定位到選項
綠色 代表該庫已經可用
紅色 代表與其他庫衝突
編寫第一個程式:
//這是點亮一個LED的程式,LED接在PG13 #include "stm32f4xx_hal.h" int main() { __GPIOG_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); while (1) { HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); } }
生成HEX檔案
點選魔術棒開啟配置視窗,到Output選項卡,勾選Create HEX File,編譯後就會在Objects資料夾生成HEX檔案。
ST-LINK utility的使用
用keil MDK上傳程式
keil MDK上傳的是axf檔案,不是hex檔案,可以免去上一步 (生成HEX檔案 );
點選魔術棒開啟配置介面,選擇自己的程式設計器
然後點setting,到flash Download勾選reset and run,這會在上傳程式後讓開發板自動重啟執行程式,否則需要手動按復位鍵才能執行程式。
Port埠選SW,其他的配置一般預設就好。檢視選擇Debug Adapter,如果為空,插入ST-LINK V2,再重新開啟option 設定即可看到;
然後點download就可以下載了
修改程式碼:4WD車底盤改為越野底盤,前後左右轉向需要修改;
app_motor.c:
#include "app_motor.h"
#include "sys.h"
#include "bsp_motor.h"
#define LeftMotor_Go() {GPIO_SetBits(Motor_Port, Left_MotoA_Pin); GPIO_ResetBits(Motor_Port, Left_MotoB_Pin);}
#define LeftMotor_Back() {GPIO_ResetBits(Motor_Port, Left_MotoA_Pin); GPIO_SetBits(Motor_Port, Left_MotoB_Pin);}
#define LeftMotor_Stop() {GPIO_ResetBits(Motor_Port, Left_MotoA_Pin); GPIO_ResetBits(Motor_Port, Left_MotoB_Pin);}
#define RightMotor_Go() {GPIO_SetBits(Motor_Port, Right_MotoA_Pin); GPIO_ResetBits(Motor_Port, Right_MotoB_Pin);}
#define RightMotor_Back() {GPIO_ResetBits(Motor_Port, Right_MotoA_Pin); GPIO_SetBits(Motor_Port, Right_MotoB_Pin);}
#define RightMotor_Stop() {GPIO_ResetBits(Motor_Port, Right_MotoA_Pin); GPIO_ResetBits(Motor_Port, Right_MotoB_Pin);}
#define LeftMotorPWM(Speed) TIM_SetCompare2(TIM4, Speed);
#define RightMotorPWM(Speed) TIM_SetCompare1(TIM4, Speed);
void Car_Run(int Speed)
{
LeftMotor_Go();
//RightMotor_Go();
LeftMotorPWM(Speed);
//RightMotorPWM(Speed);
}
void Car_Back(int Speed)
{
LeftMotor_Back();
//RightMotor_Back();
LeftMotorPWM(Speed);
//RightMotorPWM(Speed);
}
void Car_Left(int Speed)
{
//LeftMotor_Stop();
RightMotor_Go();
LeftMotor_Go();
//LeftMotorPWM(0);
RightMotorPWM(Speed);
LeftMotorPWM(Speed);
}
/**
* Function Car_Right
*/
void Car_Right(int Speed)
{
LeftMotor_Go();
//RightMotor_Stop();
RightMotor_Back();
LeftMotorPWM(Speed);
RightMotorPWM(Speed);
}
/**
* Function Car_Stop
*/
void Car_Stop(void)
{
LeftMotor_Stop();
RightMotor_Stop();
LeftMotorPWM(0);
RightMotorPWM(0);
}
/**
* Function Car_SpinLeft
*/
void Car_SpinLeft(int LeftSpeed, int RightSpeed)
{
LeftMotor_Back();
RightMotor_Go();
LeftMotorPWM(LeftSpeed);
RightMotorPWM(RightSpeed);
}
/**
* Function Car_SpinRight
*/
void Car_SpinRight(int LeftSpeed, int RightSpeed)
{
//LeftMotor_Go();
RightMotor_Back();
LeftMotor_Back();
LeftMotorPWM(LeftSpeed);
RightMotorPWM(RightSpeed);
}
修改好後,需要先build(F7)一下,再按上面流程,把更新好的燒錄進去;
*** Note: Rebuilding project, since 'Options->Output->Create Batch File' is selected.
Rebuild target 'Target 1'
assembling startup_stm32f10x_md.s...
compiling system_stm32f10x.c...
compiling delay.c...
compiling sys.c...
compiling usart.c...
compiling main.c...
compiling app_motor.c...
compiling app_linewalking.c...
compiling app_iravoid.c...
compiling app_lightseeking.c...
compiling app_ultrasonic.c...
compiling app_bluetooth.c...
Source\APP\app_bluetooth.c(89): warning: #223-D: function "app_IRFollow" declared implicitly
case 6: app_IRFollow(); break; //跟隨模式
Source\APP\app_bluetooth.c: 1 warning, 0 errors
compiling app_buzzer.c...
compiling app_colormode.c...
compiling protocol.c...
compiling bsp.c...
compiling bsp_gpio.c...
compiling bsp_motor.c...
compiling bsp_servo.c...
compiling bsp_timer.c...
compiling bsp_colorful.c...
compiling bsp_linewalking.c...
compiling bsp_iravoid.c...
compiling bsp_lightseeking.c...
compiling bsp_ultrasonic.c...
compiling bsp_adc.c...
compiling bsp_buzzer.c...
compiling bsp_fire.c...
compiling bsp_gs.c...
compiling misc.c...
compiling stm32f10x_adc.c...
compiling stm32f10x_bkp.c...
compiling stm32f10x_can.c...
compiling stm32f10x_cec.c...
compiling stm32f10x_crc.c...
compiling stm32f10x_dac.c...
compiling stm32f10x_dbgmcu.c...
compiling stm32f10x_dma.c...
compiling stm32f10x_exti.c...
compiling stm32f10x_flash.c...
compiling stm32f10x_fsmc.c...
compiling stm32f10x_gpio.c...
compiling stm32f10x_i2c.c...
compiling stm32f10x_iwdg.c...
compiling stm32f10x_pwr.c...
compiling stm32f10x_rcc.c...
compiling stm32f10x_rtc.c...
compiling stm32f10x_sdio.c...
compiling stm32f10x_spi.c...
compiling stm32f10x_tim.c...
compiling stm32f10x_usart.c...
compiling stm32f10x_wwdg.c...
linking...
Program Size: Code=20790 RO-data=402 RW-data=132 ZI-data=1388
FromELF: creating hex file...
".\output\bluetooth_control.axf" - 0 Error(s), 1 Warning(s).
Build Time Elapsed: 00:00:28
Load "D:\\BaiduNetdiskDownload\\亞博智慧 4WD智慧小車(STM32)\\5.程式原始碼\\5.程式原始碼 (3節電池版本)\\5.程式原始碼 (3節電池版本)\\其他高階實驗\\14、藍芽控制小車\\code\\STM32四驅車運動庫函式版本\\output\\bluetooth_control.axf"
Erase Done.
Programming Done.
Verify OK.
Application running ...
Flash Load finished at 19:48:56
後記
目前stm32有兩個程式庫,一個是標準庫,一個是hal庫。hal庫是新開發的庫,有更好的可移植性,但是很多函式和變數的命名跟標準庫不一樣,因此不相容標準庫寫得程式。標準庫官方已不再更新,hal庫將是未來的趨勢。 官方提供了更為方便的初始化程式碼的工具 STM32CubeMX,利用這個工具可以用圖形化的方法配置晶片並生成初始化程式碼,支援mdk,EWARM多種IDE,支援stm32全系列微控制器,只有hal庫。 用STM32CubeMX就不需要用的keil MDK的包管理器了,就免去了第3步的器件安裝和第4步的新建工程。用STM32CubeMX建立的工程會生成一個模板,在主函式的while()裡的空白處寫使用者程式,方便很多,也規範很多。