找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8808|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

從STM32到德州TM4C123的快速入門

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:476903 發(fā)表于 2019-7-20 12:49 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
從51單片機(jī)到STM32再到TM4C123

目錄

系統(tǒng)時鐘
GPIO相關(guān)
通用定時器相關(guān)
PWM相關(guān)
UART通信相關(guān)

寫在前面:
進(jìn)入TI的學(xué)習(xí),說明STM32 已經(jīng)掌握的差不多了,沒有掌握的很好也沒關(guān)系,正好兩塊單片機(jī)對比著學(xué)習(xí)更能加深映像。這篇只是簡單的介紹TI,篇幅比較短比,主要還是敘述了32和TI的不同的地方,相似的就沒有再寫出來,不能完全的拿來當(dāng)作學(xué)習(xí)資料。

一點(diǎn)學(xué)習(xí)TI的建議:
TI主要學(xué)習(xí)還是通過北航出版的《嵌入式系統(tǒng)教程——基于TivaC系列 ARM Cortex—M4微控制器》為主資料,因?yàn)檫@個資料比較通俗易懂,如果不喜歡看電子版的,可以去圖書館借這本書,還有一本配套的書,忘記叫啥名字了,但是想借的話直接圖書館檢索TM4C123GH6PM就可以找到,這本書主要還是純文字教你怎么配置相應(yīng)功能和相應(yīng)項(xiàng)目的思路。其次,除了北航的那本書,配套的資料還應(yīng)該有《TM4C1233H6PM數(shù)據(jù)手冊中文版》、中英文版本的《TM4CDriver_Library》,數(shù)據(jù)手冊的話主要就是了解相關(guān)外設(shè)功能,以及對應(yīng)映射引腳查找!禩M4CDriver_Library》主要是API文檔,因?yàn)門I不同于32,TI的函數(shù)的入口參數(shù)無法通過像32一樣的方法查找選擇合適的參數(shù),所以,該文檔就很有作用,對于一個函數(shù),可以通過該文檔進(jìn)行查找,找到函數(shù)所在的位置,有詳細(xì)的關(guān)于該函數(shù)的講解,可以了解該功能,同時還有入口參數(shù)的例子,若要選擇其他入口參數(shù),則復(fù)制該參數(shù),在程序文件里面查找定義的位置,就可以看到附近還有同類的參數(shù),選擇需要的參數(shù)即可。
對于單片機(jī)的定時,那是一部分很重要的東西,這其中就有以分資料單獨(dú)講怎么配置各種定時器,實(shí)現(xiàn)不同功能,有例程,《TM4C123G定時器》就是一份資料,學(xué)習(xí)定時器的時候?qū)φ罩鴣,會比較容易很多。
當(dāng)然了,網(wǎng)上還有很多人的學(xué)習(xí)記錄博客,這些也是很有用的資料,因?yàn)閷W(xué)習(xí)TI,就是要知道怎么用,怎么配置相關(guān)程序,博客就解決了這類問題。CSDN上面這一類型的TI教程不多,懶得找的話可以來找我拷貝。

系統(tǒng)時鐘
對于51單片機(jī)來說,在書寫程序時候是不需要進(jìn)行系統(tǒng)的時鐘函數(shù)的配置的,直接由晶振電路來提供。

如圖所示,直接是32和TI的系統(tǒng)時鐘框圖
32系統(tǒng)時鐘
TI系統(tǒng)時鐘

對于32 的時鐘來說,常用的時鐘主要分為AHB和APB兩大部分,且系統(tǒng)時鐘不需要自己來配置。
/*
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
*/
每個部分對應(yīng)多大的頻率,對應(yīng)的定時器編號,串口編號也已經(jīng)設(shè)定好。所以,在使用相對應(yīng)的功能時候直接在這兩類里面進(jìn)行查找然后使能外設(shè)就可以用了,例如使用GPIO、定時器等功能時候直接用函數(shù)里面的參數(shù)來查找:
/*
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能 GPIOA 時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口
*/
然而,對于TI來說,系統(tǒng)的時鐘也是分為AHB和APB兩種,但是在配置時候可進(jìn)行自由選擇(由于初入TI,對這里沒有仔細(xì)學(xué)習(xí),感興趣的可以了解),但是配置時鐘時候,可以只需要運(yùn)用“SysCtlClockSet()”函數(shù)來自己來設(shè)定,不像32一樣直接規(guī)定了不同外設(shè)用不同的頻率。函數(shù)的入口參數(shù)就是:系統(tǒng)的分頻、使用OSC還是PLL、OSC時鐘源選擇、外接晶體頻率,這四種來完成設(shè)備的時鐘,例如:
/*
SysCtlClockSetSYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_XTAL_16MHZ SYSCTL_OSC_MAIN
*/
最后使能相應(yīng)的功能即可。(關(guān)于其時鐘配置的參數(shù)詳細(xì)講解見)。
在配置好系統(tǒng)的時鐘之后,根據(jù)需要的外設(shè)功能進(jìn)行相應(yīng)的使能:
/*
SysCtlPeripheralEnable(uint32_t ui32Peripheral)
*/
其中的入口參數(shù)為SYSCTL_PERIPH_GPIOA、SYSCTL_PERIPH_PWM1、SYSCTL_PERIPH_TIMER1等等。
注意:32的系統(tǒng)頻率的配置是固定的,定在了不同的總線的使能函數(shù),所以不同的外設(shè)可以說是“不共用”系統(tǒng)時鐘的,而TI是先于外設(shè)使能前進(jìn)行自己時鐘配置,然后才使能所需外設(shè),且“公用”系統(tǒng)時鐘。
GPIO相關(guān)
說完時鐘和系統(tǒng)配置,下面簡紹基本的GPIO口的配置。

GPIO的功能大致上還是和32的類似,可輸出高低電平、UART通信、還可以模擬一些簡單的通信接口,如SPI,IIC等。一般工作模式有以下幾種:
浮空輸入
上拉輸入
下拉輸入
模擬輸入
開漏輸出
推挽輸出
復(fù)用推挽輸出
復(fù)用開漏輸出

一般GPIO在復(fù)位之后都有一個默認(rèn)的方向,為了安全起見,都是默認(rèn)為輸入模式,廢話不多說,直接進(jìn)入配置:
首先是32的配置
/*
void LED_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;              
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);            

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                                      
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                           
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                           
GPIO_Init(GPIOB, &GPIO_InitStructure);                                                                     
GPIO_SetBits(GPIOB,GPIO_Pin_5);            

GPIO_Init(GPIOE, &GPIO_InitStructure);                                                                                                                                             
}
*/
其次是TI的配置:
/*
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);      //使能GPIOF外設(shè)         GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
*/

不難看出,配置32和TI的方式就是不一樣的,32的GPIO是用結(jié)構(gòu)體進(jìn)行配置,TI則使用函數(shù)來進(jìn)行配置。TI的普通配置只需要進(jìn)行GPIO外設(shè)使能和方向控制即可。也不是說前面說到的功能模式就不能配置了,如果有需要可以進(jìn)行其他類型的配置。
如果要進(jìn)行端口高低電平的輸出控制,32和TI也是一樣的調(diào)用函數(shù)來進(jìn)行配置,分別是:GPIO_SetBits(GPIOE,GPIO_Pin_5); 和 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);

注意:TI的輸出高低電平使用的是同一個函數(shù)GPIOPinWrite(),對于32則使用的是兩個函數(shù):GPIO_SetBits()和GPIO_ResetBit()即可輸出高低電平。TI呢,則不是這樣的,就連入口參數(shù)也不是和32一樣那么簡單,GPIOPinWrite()入口參數(shù)就有三個,分別是GPIO_PORTx_BASE,GPIO_PIN_x,和0(低電平時候?yàn)椋,但是高電平時候不是1,而是GPIO_PIN_x)。例如PF1輸出高電平。
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);

如果想進(jìn)行其他端口詳細(xì)的配置情況可以見相關(guān)手冊資料,其中端口復(fù)用放在后面各功能實(shí)現(xiàn)時候講。
通用定時器相關(guān)
TI定時器簡介:
TI定時器呢,主要分為12個大的定時器模塊(GPTM),每個定時器模塊又分為定時器A和定時器B,所以總共有24個定時器。這12個大的定時器的屬性分為16/32位的GPTM塊和32/64位塊,其中各6塊。每個16/32位的定時器塊,提供2路16位的定時器/計(jì)數(shù)器(即定時器A和定時器B),所以通俗來說就是定時器A或B單獨(dú)配置時候就是12個16位的定時器,級聯(lián)起來配置就是6個32位的定時器。同樣的,32/64位的塊就是12個32位的定時器,級聯(lián)時候就變成6個64位的定時器。
功能說明:
每個 GPTM 模塊的主要元件包括兩個自由運(yùn)行的遞增/遞減計(jì)數(shù)器(稱作 Timer A 和 Timer B)、兩個預(yù)分頻器寄存器、兩個匹配寄存器、兩個預(yù)分頻器匹配寄存器、兩個影子寄存器、兩個加載/初始化寄存器以及與它們相關(guān)的控制功能。
接著來,該單片機(jī)的定時器和32的有點(diǎn)不同,特別是計(jì)數(shù)控制計(jì)數(shù)的寄存器。配置了32的定時器之后,定時器開始計(jì)數(shù),當(dāng)計(jì)數(shù)達(dá)到重裝載值時候產(chǎn)生中斷,之后會重新“自動”裝載計(jì)數(shù)值,但是Ti卻并非如此,是否自動裝載計(jì)數(shù)值是需要在配置時候進(jìn)行設(shè)置的,官方一點(diǎn)的來說就是:單次觸發(fā)/周期定時器模式。
相關(guān)定時器的功能如下:
接著進(jìn)入配置對比:
首先還是先32的配置:
/*
              TIM_TimeBaseStructure.TIM_Period = arr;
              TIM_TimeBaseStructure.TIM_Prescaler =psc;
              TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
              TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
              TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
*/
TI的配置:
/*
//TimerConfigure(TIMER0_BASE, TIMER_CFG_ONE_SHOT);//單次計(jì)數(shù)模式
TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);//周期性計(jì)數(shù)模式
TimerLoadSet(TIMER0_BASE, 2222222- 1);//設(shè)定預(yù)裝栽值
IntEnable(INT_TIMER0A);  //使能TIMER0A
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //TIMEOUT標(biāo)志位觸發(fā)中斷
  //TIMER0A開始計(jì)數(shù),當(dāng)計(jì)數(shù)值等于TimerLoadSet,觸發(fā)中斷
*/
同GPIO口的配置一樣的,32的配置還是結(jié)構(gòu)體類型的配置,TI還是調(diào)用函數(shù)進(jìn)行配置。
PWM模式:
通用定時器支持簡單的PWM生成模式。在 PWM 模式中,定時器被配置為 24 位或 48 位遞減計(jì)數(shù)器,也就是說在定時器里面就有這個功能,配置好以后就直接輸出PWM,而不像32一樣配置好定時器之后還要一個TIM_SetCompare1()函數(shù)來進(jìn)行PWM的輸出。
注意:除了前面介紹的不同點(diǎn)之后,與32還有一個很大的區(qū)別就是需要進(jìn)行中斷的執(zhí)行相關(guān)功能時候,需要自己調(diào)用TimerIntRegister()函數(shù)來注冊中斷函數(shù)的名字,這樣中斷才有入口。如果不需要忽略即可。同時在使能中斷時候,和32一樣需要開啟一些中斷。
PWM相關(guān)
PWM簡介:
TI有2個PWM模塊,每個模塊由4個PWM發(fā)生器模塊和一個控制器模塊組成,一共可以產(chǎn)生16個PWM輸出。每個發(fā)生器模塊都能夠產(chǎn)生2個PWM信號,這兩個信號是基于同一個定時器和頻率,也可以配置成單獨(dú)產(chǎn)生信號。PWM模塊發(fā)生器產(chǎn)生的兩個信號為PWMA和PWMB。
以下為結(jié)構(gòu)圖:
功能描述:
  • 時鐘選擇:系統(tǒng)時鐘和預(yù)分系統(tǒng)時鐘
  • PWM定時器
每個PWM發(fā)生器中都有區(qū)別與通用定時器的定時器,在向下計(jì)數(shù)模式或向上/向下計(jì)數(shù)模式。
  • PWM比較器
每個PWM發(fā)生器都有兩個比較器。具體功能和32一樣就不再累贅。
  • PWM信號發(fā)生器
初始化及配置:

首先還是32的:
/*
              TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
              TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
              TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
              TIM_OC2Init(TIM3, &TIM_OCInitStructure);
              TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
*/

其次是TI的:
/*
//單獨(dú)配置的系統(tǒng)時鐘
SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);
//配置引腳為PWM功能
syslPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinConfigure(GPIO_PF3_M1PWM7);
GPIOPinTypePWM(GPIOF, Pin3);
//配置 PWM1 Generator3·發(fā)生器
PMGenConfigure(PWM1_BASE, PWM_GEN_3, PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);
//配置 PWM1 Generator3 周期
PWenPeriodSet(PWM1_BASE, PWM_GEN_3, SysCtlClockGet()/freq - 1);
//配置 PWM1 Generator3·占空比
PMPulseWidthSet(PWM1_BASE, PWM_OUT_7, PWMGenPeriodGet(PWM1_BASE, PWM_GEN_3)*duty - 1);
//使能PWM1的輸出
PWOutputState(PWM1_BASE, PWM_OUT_7_BIT, true);
//使能 PWM1 發(fā)生器模塊
PMGenEnable(PWM1_BASE, PWM_GEN_3);
*/
還是和前面一樣,32的PWM配置過程是結(jié)構(gòu)體類型的,而TI則還是庫函數(shù)來進(jìn)行配置的。有一點(diǎn)值得注意哦,TI在配置PWM時候不需要進(jìn)行IO口的復(fù)用配置和映射等相關(guān)操作,只要找到對應(yīng)的IO口就可以輸出信號。
UART通信相關(guān)
微控制器的UART簡介:
TI控制器配備了多達(dá)8路的UART,其基本功能和32差不多,具體功能可以參考32相關(guān)文檔


這部分我們先來看32和TI的配置,從配置中找不同的地方加以說明

首先是32配置:
/*
USART_InitStruct.USART_BaudRate=arr;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits= USART_StopBits_1;
USART_InitStruct.USART_WordLength= USART_WordLength_8b;
USART_Init(USART2, &USART_InitStruct);

              USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
              USART_Cmd(USART2, ENABLE);
*/
32的配置過程就不加以敘述

TI的配置:
/*
    SCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);              //使能GPIO
              SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//使能UART0
              GPIOPinConfigure(GPIO_PA0_U0RX); //復(fù)用GPIO
              GPIOPinConfigure(GPIO_PA1_U0TX);·
              GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);//
              UARTClockSourceSet(UART0_BASE,UART_CLOCK_PIOSC);//選擇串口時鐘來源
              UARTStdioConfig(0,115200,16000000);//選擇模式、波特率、和時鐘大小
*/

從配置上可以看出,32和TI的 配置都是需要將UART的端口映射到對應(yīng)的GPIO口上,當(dāng)然了,配置過程依舊是32為結(jié)構(gòu)體,TI為調(diào)用庫函數(shù),但是在配置時候,32還要進(jìn)行相關(guān)NVIC中斷配置,設(shè)置中斷優(yōu)先級,設(shè)置停止位等等。TI的配置就是以上那些函數(shù),其他的功能都是默認(rèn),如果需要可以進(jìn)行自行查找配置。

這里還涉及到了端口復(fù)用。TI的端口復(fù)用很簡單,不用像32一樣先進(jìn)行各種IO口的配置,直接用函數(shù)SCtlPeripheralEnable() 使能相關(guān)IO口的時鐘,GPIOPinConfigure() 函數(shù)里選擇相應(yīng)復(fù)用的功能即可完成配置。
總的來說復(fù)用是在你要使用的外設(shè)功能函數(shù)里面進(jìn)行的,不需要像32一樣拿出來進(jìn)行配置來使用。
基于UART通信等相關(guān)知識點(diǎn),可以先熟悉32的通信知識點(diǎn)后來使用TI,則會變得容易許多。

Word格式文檔51黑下載地址:
Ti-STM32-C51.rar (1.57 MB, 下載次數(shù): 53)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表