1. 程式人生 > >STM32 智慧小車 藍芽控制-開發環境搭建

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()裡的空白處寫使用者程式,方便很多,也規範很多。