從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è)備的時鐘,例如: /* SysCtlClockSet(SYSCTL_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發(fā)生器都有兩個比較器。具體功能和32一樣就不再累贅。 初始化及配置:
首先還是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)
2019-7-20 12:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|