Keil新版本出來(lái)了,推出了一種全新開發(fā)模式RTE框架(?Run-Time Environment),更好用了。然而網(wǎng)上的教程資料竟還都是把Keil5當(dāng)成Keil4來(lái)用,直接不使用這個(gè)功能。當(dāng)前正點(diǎn)原子或野火的教程提供的例程雖有提到Keil5,但也是基本上當(dāng)Keil4來(lái)用,還是傳統(tǒng)的模式或標(biāo)準(zhǔn)庫(kù)或HAL庫(kù)。當(dāng)然這用來(lái)學(xué)習(xí)挺好,但是如果用來(lái)開發(fā)建議還是使用下Keil5的RTE框架。
現(xiàn)在的單片機(jī)開發(fā)早已經(jīng)變天,早已不是十年前刀耕火種的樣子,開發(fā)和使用越來(lái)越友好了。單片機(jī)的開發(fā)趨勢(shì)越來(lái)越接近于軟件層開發(fā),底層驅(qū)動(dòng)的封裝變成了芯片廠家做的工作。這是一種趨勢(shì),對(duì)于開發(fā)使用人員而言,可以更專注于需求和效率。
RTE框架直接給你提供了現(xiàn)成的板級(jí)驅(qū)動(dòng)包和可視化模塊配置,你需要做的只是配置和在驅(qū)動(dòng)層之上開發(fā)應(yīng)用就行了。且包含了包管理功能,包和組件使用和升級(jí)更方便了,這是一大特色,其他廠家都可以貢獻(xiàn)和提供驅(qū)動(dòng)包,其他三方都可以提供模塊組件,開放共建。包括嵌入式內(nèi)核你都不要移植,且可以切換想用哪個(gè)用哪個(gè),不得不佩服老外IDE做的是真用心啊。
希望國(guó)產(chǎn)IDE軟件也多學(xué)習(xí)學(xué)習(xí)老外,如果國(guó)產(chǎn)軟件也能這么強(qiáng)大好用該多好,那時(shí)候國(guó)產(chǎn)芯片想不火都難。STM32的火是有原因的,因?yàn)樗牟僮魇褂蒙媳绕鹌渌麊纹瑱C(jī)都簡(jiǎn)單。這得益于ST這家公司的睿智,先是提供標(biāo)準(zhǔn)庫(kù),后HAL庫(kù),如今ST推出的STM32CubeMX配置軟件,就是想讓你更簡(jiǎn)單更好用,易用性上甩其他廠家?guī)讞l街,就是讓你只用它家的就行了,以此來(lái)籠絡(luò)你,壟斷你,但它只能耕stm32這一畝三分地。
在單片機(jī)領(lǐng)域,基于Arm Cortex M內(nèi)核的產(chǎn)品已經(jīng)占據(jù)很大的一部分份額,比較知名的ST的STM32系列,NXP的LPC系列都是其中非常棒的產(chǎn)品。各個(gè)廠家為了用戶能更好的使用這些單片機(jī)產(chǎn)品,都推出了各自的軟件工具和SDK,以便幫助用戶簡(jiǎn)單快速的開發(fā)軟件。Arm公司為了防止Arm軟件開發(fā)的碎片化,提出并實(shí)施了CMSIS,這個(gè)是Arm公司與多家不同的芯片和軟件供應(yīng)商一起緊密合作定義的,提供了內(nèi)核與外設(shè)、實(shí)時(shí)操作系統(tǒng)和中間設(shè)備之間的通用接口。后續(xù)用戶需要做的僅是在應(yīng)用層上做開發(fā)就可以了。
CMSIS的整體架構(gòu):
前言
曾記得十年前使用STM32時(shí)那叫一個(gè)麻煩,參考正點(diǎn)原子和野火的教程學(xué)習(xí)直接操作寄存器。
其實(shí)這也沒(méi)啥,畢竟這是傳統(tǒng)的單片機(jī)的開發(fā)方式。如之前的51,avr,pic,msp430,我想這幾款單片機(jī)都玩過(guò)的肯定都是古董玩家,想當(dāng)年這幾款單片機(jī)沒(méi)少折騰我,當(dāng)然都是對(duì)著手冊(cè)操作寄存器,也沒(méi)啥難的,就是很低效,換一種單片機(jī)就得先熟悉它的風(fēng)格。
現(xiàn)在單片機(jī)開發(fā)變簡(jiǎn)單了許多,這歸功于stm32做的不錯(cuò)。之所以stm32它一直很火,是因?yàn)樗_創(chuàng)了一個(gè)先河,j降低了單片機(jī)的門檻,讓單片機(jī)操作越來(lái)越簡(jiǎn)單了。ST官方最先推出了標(biāo)準(zhǔn)庫(kù),然而依舊覺(jué)得不是很簡(jiǎn)單。再后來(lái)ST官方又推出了HAL庫(kù),接著STM32CubeMX配置軟件的橫空出世,讓STM32可視化配置硬件參數(shù)和寄存器,變更好用了。但STM32CubeMX僅用在ST的產(chǎn)品上,深度綁定。
這里要介紹下Keil5的全新的開發(fā)方式RTE框架的使用。
可視化的最新的keil5軟件真強(qiáng)大,但網(wǎng)上提供的教程大多是基于傳統(tǒng)keil4的開發(fā)模式,有的雖然標(biāo)題提到了RTE這種全新的包管理模式,但是還是混雜著標(biāo)準(zhǔn)庫(kù)或HAL庫(kù)的概念讓人混淆不清,還在教你如何手工添加庫(kù)和文件,沒(méi)體現(xiàn)RTE的好處和使用。
其實(shí)RET這種模式下就不要提什么標(biāo)準(zhǔn)庫(kù)或HAL庫(kù)了,就當(dāng)是各個(gè)廠家提供好了現(xiàn)成的板級(jí)驅(qū)動(dòng)就好。你需要在做些配置且在驅(qū)動(dòng)層之上開發(fā)應(yīng)用。驅(qū)動(dòng)層之下不用你過(guò)多關(guān)注,驅(qū)動(dòng)層和常用模塊都已提供好了。這是未來(lái)的一種趨勢(shì),因此建議嘗試和使用下Keil5的RTE開發(fā)模式。
我通過(guò)查閱官網(wǎng)拿到第一手資料,在此整理下我的總結(jié)分享給大家。后續(xù)再看到應(yīng)用層直接操作寄存器和板級(jí)接口操作的,不要再這樣混著用啦,這種非RTE框架模式的本意。
不知你有沒(méi)有覺(jué)察到,Keil5引入的這一開發(fā)理念很先進(jìn)。會(huì)成為今后的主流趨勢(shì),值得我們學(xué)習(xí)借鑒。以后軟件開發(fā)者可以把精力放在快速的開發(fā)應(yīng)用和創(chuàng)新上,驅(qū)動(dòng)操作封裝成了芯片廠家要做的事。當(dāng)多數(shù)國(guó)人還在卷單片機(jī)寄存器操作的時(shí)候,老外又一次走在了前列。Keil5不愧是王者,IDE好用易用性上排第一。以后不但芯片硬件上可替換,軟件應(yīng)用層也可以做到很少改動(dòng)。
以下是我的分享,希望對(duì)大家有所幫助。另外,本文中如果有需改善的地方,歡迎留言,謝謝!
什么是RTE?
Keil5 最新的 RTE 框架是一種用于配置嵌入式軟件應(yīng)用程序的軟件組件。它提供了圖形用戶界面 (GUI),使開發(fā)人員可以輕松配置系統(tǒng)組件,如處理器外設(shè)、通信接口和內(nèi)存管理,而不需要手動(dòng)編寫代碼。相比原來(lái)使用的標(biāo)準(zhǔn)庫(kù)或 HAL 庫(kù)的方式,Keil5 RTE 框架的優(yōu)點(diǎn)在于它簡(jiǎn)化了開發(fā)流程,提供了一種簡(jiǎn)單直觀的配置方法,并減少了必須手動(dòng)編寫的代碼數(shù)量,可以節(jié)省時(shí)間并減少錯(cuò)誤。
軟件組件介紹
MDK 提供軟件組件(Software Components),用于使用稱為運(yùn)行時(shí)環(huán)境(RTE) 的框架創(chuàng)建應(yīng)用程序。這些組件以獨(dú)立于 μVision 安裝的軟件包形式提供。軟件包由 Arm 或第三方提供。
Software Components
圖為Arm Keil提供的軟件包,結(jié)構(gòu)清晰。軟件包可以包含設(shè)備支持,包括驅(qū)動(dòng)程序、CMSIS 庫(kù)和中間件組件。其中的設(shè)備系列包,由各個(gè)芯片廠家提供。
設(shè)備系列包 (DFP):包含用于微控制器設(shè)備系列的 CMSIS 系統(tǒng)/啟動(dòng)、驅(qū)動(dòng)程序和閃存算法。
CMSIS:包含通用 CMSIS 組件(CORE、DSP 和 NN 庫(kù),以及 RTOS 實(shí)現(xiàn))。
MDK-Middleware:包含屬于 MDK-Professional 一部分的中間件庫(kù)。
在項(xiàng)目中使用軟件組件:
1.使用Pack Installer安裝或更新包含預(yù)構(gòu)建軟件組件的軟件包。
2.使用窗口Manage Run-Time Environment將軟件組件添加到項(xiàng)目中。添加的組件顯示在“項(xiàng)目”窗口中。
3.(可選)設(shè)置組件的選項(xiàng)以指定屬性。
4.(可選)為特定目標(biāo)選擇軟件包。
新項(xiàng)目結(jié)構(gòu)介紹
不要再用以往傳統(tǒng)的手動(dòng)創(chuàng)建所有目錄,再引入HAL庫(kù)的落后方式了。當(dāng)然可以在創(chuàng)建一些應(yīng)用層的目錄。其他層的按照配置出來(lái)的已經(jīng)很清晰了。以下舉例介紹下最的項(xiàng)目結(jié)構(gòu)。
?以上目錄中,默認(rèn)配置生成的是綠色顯示的。Device就相當(dāng)于底層驅(qū)動(dòng)層,驅(qū)動(dòng)層里面小寫字母開頭的文件,是各個(gè)廠家官方提供的固件操作功能。大寫字母開頭的就是驅(qū)動(dòng)接口及實(shí)現(xiàn)。在應(yīng)用層使用時(shí)最好嚴(yán)格分層,不要混合調(diào)用固件接口或操作寄存器了,而是應(yīng)通過(guò)大寫字母開頭的驅(qū)動(dòng)接口去配置和調(diào)用。(注:截圖部分的代碼僅為示例。它不好的地方是,里面摻雜使用了如GPIOD-BSRR這種寄存器操作,后文有正解。)
CMSIS是一個(gè)標(biāo)準(zhǔn),以上CMSIS里的是標(biāo)準(zhǔn)驅(qū)動(dòng)的實(shí)現(xiàn),其中的串口驅(qū)動(dòng)和操作系統(tǒng)內(nèi)核放置在里面。那個(gè)Board Support算是個(gè)模塊兒化組件,提供了一些通用的硬件模塊操作,如以上的是個(gè)跟板子硬件相關(guān)的LED燈的操作實(shí)現(xiàn),可以拿來(lái)復(fù)用,不過(guò)需要根據(jù)板子的實(shí)際管腳分配來(lái)配置。
應(yīng)用層使用介紹
Board Support這個(gè)文件夾,雖然是配置出來(lái)的,但是它實(shí)際就是一個(gè)應(yīng)用層功能實(shí)現(xiàn)??梢杂脕?lái)學(xué)習(xí),看下它是如何使用GPIO接口驅(qū)動(dòng)了。那么后續(xù)你的使用基本跟它類似。它的文件內(nèi)容如下:
#include "Board_LED.h"
#include "GPIO_STM32F10x.h"
const GPIO_PIN_ID Pin_LED[] = {
{ GPIOE, 8 },
{ GPIOE, 9 },
{ GPIOE, 10 },
{ GPIOE, 11 },
{ GPIOE, 12 },
{ GPIOE, 13 },
{ GPIOE, 14 },
{ GPIOE, 15 },
};
#define LED_COUNT (sizeof(Pin_LED)/sizeof(GPIO_PIN_ID))
/**
\fn int32_t LED_Initialize (void)
\brief Initialize LEDs
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t LED_Initialize (void) {
uint32_t n;
/* Configure pins: Push-pull Output Mode (50 MHz) with Pull-down resistors */
for (n = 0; n < LED_COUNT; n++) {
GPIO_PortClock (Pin_LED[n].port, true);
GPIO_PinWrite (Pin_LED[n].port, Pin_LED[n].num, 0);
GPIO_PinConfigure(Pin_LED[n].port, Pin_LED[n].num,
GPIO_OUT_PUSH_PULL,
GPIO_MODE_OUT2MHZ);
}
return 0;
}
/**
\fn int32_t LED_Uninitialize (void)
\brief De-initialize LEDs
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t LED_Uninitialize (void) {
uint32_t n;
/* Configure pins: Input mode, without Pull-up/down resistors */
for (n = 0; n < LED_COUNT; n++) {
GPIO_PinConfigure(Pin_LED[n].port, Pin_LED[n].num,
GPIO_IN_FLOATING,
GPIO_MODE_INPUT);
}
return 0;
}
/**
\fn int32_t LED_On (uint32_t num)
\brief Turn on requested LED
\param[in] num LED number
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t LED_On (uint32_t num) {
int32_t retCode = 0;
if (num < LED_COUNT) {
GPIO_PinWrite(Pin_LED[num].port, Pin_LED[num].num, 1);
}
else {
retCode = -1;
}
return retCode;
}
/**
\fn int32_t LED_Off (uint32_t num)
\brief Turn off requested LED
\param[in] num LED number
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t LED_Off (uint32_t num) {
int32_t retCode = 0;
if (num < LED_COUNT) {
GPIO_PinWrite(Pin_LED[num].port, Pin_LED[num].num, 0);
}
else {
retCode = -1;
}
return retCode;
}
/**
\fn int32_t LED_SetOut (uint32_t val)
\brief Write value to LEDs
\param[in] val value to be displayed on LEDs
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t LED_SetOut (uint32_t val) {
uint32_t n;
for (n = 0; n < LED_COUNT; n++) {
if (val & (1<<n)) {
LED_On (n);
} else {
LED_Off(n);
}
}
return 0;
}
/**
\fn uint32_t LED_GetCount (void)
\brief Get number of LEDs
\return Number of available LEDs
*/
uint32_t LED_GetCount (void) {
return LED_COUNT;
}
代碼分析:該代碼屬于應(yīng)用層,為應(yīng)用提供了幾個(gè)操作LED的接口(Board_LED.h聲明功能接口),代碼里包含了GPIO_STM32F10x.h驅(qū)動(dòng)接口頭文件,使用了GPIO接口驅(qū)動(dòng)。通過(guò)它可以看出,應(yīng)用層的功能封裝和實(shí)現(xiàn),基本不涉及寄存器操作。都是通過(guò)驅(qū)動(dòng)接口配置和訪問(wèn)的。
main入口函數(shù)介紹
/***************************************************************************//**
* \file main.c
*
* \details LED Blinking using RTX CMSIS V2 RTOS
*
* \author EmbeTronicX
*
* \Tested with Proteus
*
* *****************************************************************************/
#include "RTE_Components.h"
#include CMSIS_device_header
#include "cmsis_os2.h"
#include "stm32f10x.h"
#include "Board_LED.h"
/*
** This thread will turns ON and turns OFF the PORT-D LEDs with 1second delay.
**
** Arguments:
** arg -> Argument of this thread. osThreadNew()'s 2nd arg has to come here.
**
*/
__NO_RETURN static void LED_Blink_PortD( void *arg )
{
(void)arg; //unused variable
//set Port D as output
//GPIOD->MODER = 0x55555555;
for (;;) //infinite for loop
{
//Turn ON the LED of Port-D
LED_On(3);
osDelay(1000); //1sec delay
//Turn OFF the LED of Port-D
LED_Off(2);
//GPIOD->BSRR = 0xFFFF0000;
osDelay(1000); //1sec delay
}
}
/*
** This thread will turns ON and turns OFF the PORT-E LEDs with 3second delay.
**
** Arguments:
** arg -> Argument of this thread. osThreadNew()'s 2nd arg has to come here.
**
*/
__NO_RETURN static void LED_Blink_PortE( void *arg )
{
(void)arg; //unused variable
//set Port E as output
//GPIOE->MODER = 0x55555555;
for (;;) //infinite for loop
{
//Turn ON the LED of Port-E
//GPIOE->BSRR = 0x0000FFFF;
LED_SetOut(0);
osDelay(3000); //3sec delay
//Turn OFF the LED of Port-E
//GPIOE->BSRR = 0xFFFF0000;
osDelay(3000); //3sec delay
LED_SetOut(1);
}
}
/*
** main function
**
** Arguments:
** none
**
*/
int main (void)
{
// System Initialization
SystemCoreClockUpdate();
LED_Initialize();
osKernelInitialize(); // Initialize CMSIS-RTOS
osThreadNew(LED_Blink_PortD, NULL, NULL); // Create application main thread
osThreadNew(LED_Blink_PortE, NULL, NULL); // Create application main thread
osKernelStart(); // Start thread execution
for (;;)
{
//Dummy infinite for loop.
}
}
以上是main入口函數(shù)的實(shí)現(xiàn),你有在里面發(fā)現(xiàn)寄存器和特殊的硬件操作嗎?沒(méi)有的,應(yīng)用層看不到跟某一平臺(tái)的相關(guān)性,更別提會(huì)出現(xiàn)寄存器操作了。這跟以往的開發(fā)模式有很大的不同,結(jié)構(gòu)更清晰合理了。如果你的應(yīng)用中混雜了寄存器或板級(jí)的驅(qū)動(dòng)接口調(diào)用,請(qǐng)留意這樣用是否合適,有沒(méi)有其他的方式。
以上代碼未移植嵌入式內(nèi)核就可以使用RTX嵌入式系統(tǒng)啦,是不是很簡(jiǎn)單和方便?如果想換系統(tǒng)怎么辦?只需要改配置就行。如果要換單片機(jī)呢?那么也放心,你的很多應(yīng)用層代碼都是可以復(fù)用了,僅是改下驅(qū)動(dòng)層的接口參數(shù)配置,這就是這一開發(fā)模式的好處。以上代碼示例不是針對(duì)stm32這一種,在keil中支持的任一單片機(jī)我都可以輕易切換。
串口驅(qū)動(dòng)使用
可以看下串口的使用有多么的簡(jiǎn)單,完全顛覆了以往傳統(tǒng)的開發(fā)方式。只需先配置好串口硬件管腳后,剩下的就是像上位機(jī)純軟件的開發(fā)一樣調(diào)用接口函數(shù)即可,以下示例可以看下夠簡(jiǎn)單吧。
在RTE_device.h文件中,配置串口一的硬件管腳如下:
?使用如下(main.c):
#include <string.h>
#include "RTE_Components.h"
#include CMSIS_device_header
#include "cmsis_os2.h"
#include "stm32f10x.h"
#include "Board_LED.h"
#include "Driver_USART.h"
extern ARM_DRIVER_USART Driver_USART1;
/* Variable definitions ------------------------------------------------------*/
static uint8_t rxBuffer[1024] = {0};
static uint8_t txBuffer[1024] = {0};
/* Function declarations -----------------------------------------------------*/
static void USART1_Callback(uint32_t event);
/**
* @brief USART1 callback function.
* @param event: USART events notification mask.
* @return None.
*/
static void USART1_Callback(uint32_t event)
{
if(event & ARM_USART_EVENT_RX_TIMEOUT)
{
Driver_USART1.Control(ARM_USART_ABORT_RECEIVE, 1);
uint32_t length = Driver_USART1.GetRxCount();
memcpy(txBuffer, rxBuffer, length);
Driver_USART1.Send(txBuffer, length);
Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));
}
}
void uart_init()
{
Driver_USART1.Initialize(USART1_Callback);
Driver_USART1.PowerControl(ARM_POWER_FULL);
Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS |
ARM_USART_DATA_BITS_8 |
ARM_USART_PARITY_NONE |
ARM_USART_STOP_BITS_1 |
ARM_USART_FLOW_CONTROL_NONE, 115200);
Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);
Driver_USART1.Control(ARM_USART_CONTROL_RX, 1);
Driver_USART1.Receive(rxBuffer, sizeof(rxBuffer));
}
關(guān)于CMSIS
CMSIS 是一個(gè)獨(dú)立于供應(yīng)商的硬件抽象層,適用于基于 Arm? Cortex? 處理器的微控制器。CMSIS( Cortex 微控制器軟件接口標(biāo)準(zhǔn))的主要目標(biāo)是提高軟件在不同微控制器和工具鏈之間的可移植性和可重用性。這允許來(lái)自不同來(lái)源的軟件無(wú)縫集成在一起。一旦學(xué)會(huì),CMSIS 就可以通過(guò)使用標(biāo)準(zhǔn)化的軟件功能來(lái)幫助加快軟件開發(fā)。
CMSIS 具有模塊化結(jié)構(gòu),每個(gè)模塊都可以獨(dú)立使用或更新。一些模塊是特定于設(shè)備的,因此對(duì)于每個(gè) ARM Cortex 微控制器系列,都會(huì)創(chuàng)建一個(gè) CMSIS 模塊集合,即設(shè)備系列包 (DFP)。有助于簡(jiǎn)化軟件重用、減少微控制器開發(fā)人員的學(xué)習(xí)曲線、加速項(xiàng)目構(gòu)建和調(diào)試,從而縮短新應(yīng)用程序的上市時(shí)間。
CMSIS 最初是作為基于 Arm? Cortex?-M 的處理器的獨(dú)立于供應(yīng)商的硬件抽象層,后來(lái)擴(kuò)展為支持基于 Arm Cortex-A 的入門級(jí)處理器。為了簡(jiǎn)化訪問(wèn),CMSIS 定義了通用工具接口,并通過(guò)為處理器和外圍設(shè)備提供簡(jiǎn)單的軟件接口來(lái)實(shí)現(xiàn)一致的設(shè)備支持。
CMSIS 是與各種芯片和軟件供應(yīng)商密切合作而定義的,它提供了一種通用方法來(lái)連接外圍設(shè)備、實(shí)時(shí)操作系統(tǒng)和中間件組件。它旨在支持來(lái)自多個(gè)供應(yīng)商的軟件組件的組合。
CMSIS 的創(chuàng)建是為了幫助行業(yè)實(shí)現(xiàn)標(biāo)準(zhǔn)化。它在廣泛的開發(fā)工具和微控制器中實(shí)現(xiàn)了一致的軟件層和設(shè)備支持。
CMSIS 是在GitHub上開源和協(xié)作開發(fā)的。
CMSIS 驅(qū)動(dòng)程序規(guī)范
是一種軟件 API,它描述了中間件堆棧和用戶應(yīng)用程序的外圍驅(qū)動(dòng)程序接口。CMSIS-Driver API 設(shè)計(jì)為通用且獨(dú)立于特定的 RTOS,使其可在廣泛的受支持微控制器設(shè)備中重復(fù)使用。CMSIS-Driver API 涵蓋了受支持外設(shè)類型的廣泛用例,但無(wú)法考慮所有潛在用例。隨著時(shí)間的推移,CMSIS-Driver API 將擴(kuò)展到更多的組以涵蓋新的用例。
CMSIS 軟件包在帶有頭文件和文檔的組件類CMSIS?驅(qū)動(dòng)程序下發(fā)布 API 接口。這些頭文件是實(shí)現(xiàn)標(biāo)準(zhǔn)化外設(shè)驅(qū)動(dòng)接口的參考。這些實(shí)現(xiàn)通常在組件類CMSIS?驅(qū)動(dòng)程序下的相關(guān)微控制器系列的設(shè)備系列包中發(fā)布。設(shè)備系列包可能包含組件類設(shè)備中的附加接口,以使用附加設(shè)備特定接口(例如內(nèi)存總線、GPIO 或 DMA)擴(kuò)展此 CMSIS 驅(qū)動(dòng)程序規(guī)范涵蓋的標(biāo)準(zhǔn)外設(shè)驅(qū)動(dòng)程序。
由上圖可以看出,中間件或上層應(yīng)用,通過(guò)CMSIS驅(qū)動(dòng)接口,跟底層的硬件進(jìn)行了隔離。建議組件和應(yīng)用開發(fā)上直接使用CMSIS提供的驅(qū)動(dòng)接口,最好不要直接調(diào)用Device(跟特定平臺(tái)相關(guān)的標(biāo)準(zhǔn)庫(kù)或HAL庫(kù))的接口,除非迫不得已。這樣可以做到底層硬件的變動(dòng)而不影響中間件和上層業(yè)務(wù)。
CMSIS驅(qū)動(dòng)接口使用文檔地址:Usage and Description
結(jié)語(yǔ)
最后,歡迎大家體驗(yàn)Keil5的全新的RTE開發(fā)模式??傊褂靡埠芎?jiǎn)單,關(guān)鍵是要轉(zhuǎn)變思想,一定要有軟件分層的思想,摒棄以往不好的開發(fā)習(xí)慣,尤其是長(zhǎng)期以來(lái)習(xí)慣操作寄存器的思維慣性。讓代碼分封更清晰,模塊化更利于復(fù)用,讓維護(hù)更簡(jiǎn)單,讓升級(jí)更方便。
當(dāng)咱們還在卷寄存器操作的時(shí)候,老外又一次走在了前列。推廣下這一單片機(jī)開發(fā)理念,這一開發(fā)理念是未來(lái)的趨勢(shì)!今后人人都可以根據(jù)需要使用不同的單片機(jī)快速的進(jìn)行業(yè)務(wù)開發(fā)。會(huì)一種就行,不用去卷各家不同單片機(jī)的操作。驅(qū)動(dòng)封裝是芯片或IDE廠家的事。國(guó)產(chǎn)IDE軟件應(yīng)該像keil學(xué)習(xí),讓廣大開發(fā)者好用,才有市場(chǎng),才能國(guó)產(chǎn)化崛起!
risc-v單片機(jī)是國(guó)產(chǎn)化彎道超車的機(jī)會(huì),但就是碎片化嚴(yán)重,驅(qū)動(dòng)封裝的不太好用,且沒(méi)有好用的國(guó)產(chǎn)IDE。要是像stm32那般好用,想不火都難。各家的IDE各自為戰(zhàn),重復(fù)的造輪子,沒(méi)有統(tǒng)一的支持各個(gè)廠家的不同芯片。risc-v的世界缺乏像ARM這種的統(tǒng)一領(lǐng)導(dǎo)和規(guī)范,得形成合力避免重復(fù)和各自為戰(zhàn),才能擴(kuò)大生態(tài),開放共建實(shí)現(xiàn)共贏。開發(fā)者沒(méi)選一個(gè)芯片就得換套IDE?就得重新熟悉一遍操作嗎?
市面上的各大 RISC-V 芯片或 IP 公司,都在做自己的 IDE 用自己的工具鏈。那么為什么各家都在做各自的工具鏈?我認(rèn)為還是沒(méi)有形成類似于 ARM 的 CMSIS 這樣的嵌入式軟件接口標(biāo)準(zhǔn),來(lái)統(tǒng)一管理底層軟件接口,于是乎就變成了各自玩各的沒(méi)有統(tǒng)一。這也是導(dǎo)致 RISC-V 軟件生態(tài)薄弱,碎片化的一個(gè)重要因素,嚴(yán)重影響其生態(tài)。大部分的 RISC-V 廠商的開發(fā) IDE,還是基于開源的 eclipse + gcc toolchains + openocd 的方案來(lái)開發(fā)和調(diào)試芯片產(chǎn)品,雖然這種方案實(shí)現(xiàn)快些,但是IDE太大太臃腫,且僅支持自家的芯片。如果能基于notepad--用QT實(shí)現(xiàn)一款,像Keil一樣好用該多好。
最后,期待國(guó)產(chǎn)單片機(jī)開發(fā)IDE軟件也能朝著更好用,易用的方向發(fā)展,變得更好。
書籍推薦 首頁(yè)關(guān)注博主公眾號(hào)《貓青年》,回復(fù)“書籍”,獲取更多高清電子書資源!完全免費(fèi)!
GitHub - imarvinle/awesome-cs-books: ?? 經(jīng)典編程書籍大全,涵蓋:計(jì)算機(jī)系統(tǒng)與網(wǎng)絡(luò)、系統(tǒng)架構(gòu)、算法與數(shù)據(jù)結(jié)構(gòu)、前端開發(fā)、后端開發(fā)、移動(dòng)開發(fā)、數(shù)據(jù)庫(kù)、測(cè)試、項(xiàng)目與團(tuán)隊(duì)、程序員職業(yè)修煉、求職面試等
其他資源
CMSIS 驅(qū)動(dòng)程序規(guī)范
STM32 RTOS - GPIO Tutorial (CMSIS V2)
Documentation – Arm Developer
?CMSIS-Driver Version 2.8.0文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-450150.html
https://www.icxbk.com/article/detail?aid=483文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-450150.html
到了這里,關(guān)于還在老一套?STM32使用新KEIL5的IDE,全新開發(fā)模式RTE介紹及使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!