從51單片機到STM32再到TM4C123
目錄 系統(tǒng)時鐘 GPIO相關 通用定時器相關 PWM相關 UART通信相關
寫在前面: 進入TI的學習,說明STM32 已經(jīng)掌握的差不多了,沒有掌握的很好也沒關系,正好兩塊單片機對比著學習更能加深映像。這篇只是簡單的介紹TI,篇幅比較短比,主要還是敘述了32和TI的不同的地方,相似的就沒有再寫出來,不能完全的拿來當作學習資料。
一點學習TI的建議: TI主要學習還是通過北航出版的《嵌入式系統(tǒng)教程——基于TivaC系列 ARM Cortex—M4微控制器》為主資料,因為這個資料比較通俗易懂,如果不喜歡看電子版的,可以去圖書館借這本書,還有一本配套的書,忘記叫啥名字了,但是想借的話直接圖書館檢索TM4C123GH6PM就可以找到,這本書主要還是純文字教你怎么配置相應功能和相應項目的思路。其次,除了北航的那本書,配套的資料還應該有《TM4C1233H6PM數(shù)據(jù)手冊中文版》、中英文版本的《TM4CDriver_Library》,數(shù)據(jù)手冊的話主要就是了解相關外設功能,以及對應映射引腳查找。《TM4CDriver_Library》主要是API文檔,因為TI不同于32,TI的函數(shù)的入口參數(shù)無法通過像32一樣的方法查找選擇合適的參數(shù),所以,該文檔就很有作用,對于一個函數(shù),可以通過該文檔進行查找,找到函數(shù)所在的位置,有詳細的關于該函數(shù)的講解,可以了解該功能,同時還有入口參數(shù)的例子,若要選擇其他入口參數(shù),則復制該參數(shù),在程序文件里面查找定義的位置,就可以看到附近還有同類的參數(shù),選擇需要的參數(shù)即可。 對于單片機的定時,那是一部分很重要的東西,這其中就有以分資料單獨講怎么配置各種定時器,實現(xiàn)不同功能,有例程,《TM4C123G定時器》就是一份資料,學習定時器的時候對照著來,會比較容易很多。 當然了,網(wǎng)上還有很多人的學習記錄博客,這些也是很有用的資料,因為學習TI,就是要知道怎么用,怎么配置相關程序,博客就解決了這類問題。CSDN上面這一類型的TI教程不多,懶得找的話可以來找我拷貝。
系統(tǒng)時鐘對于51單片機來說,在書寫程序時候是不需要進行系統(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); */ 每個部分對應多大的頻率,對應的定時器編號,串口編號也已經(jīng)設定好。所以,在使用相對應的功能時候直接在這兩類里面進行查找然后使能外設就可以用了,例如使用GPIO、定時器等功能時候直接用函數(shù)里面的參數(shù)來查找:
/* RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能 GPIOA 時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口 */ 然而,對于TI來說,系統(tǒng)的時鐘也是分為AHB和APB兩種,但是在配置時候可進行自由選擇(由于初入TI,對這里沒有仔細學習,感興趣的可以了解),但是配置時鐘時候,可以只需要運用“SysCtlClockSet()”函數(shù)來自己來設定,不像32一樣直接規(guī)定了不同外設用不同的頻率。函數(shù)的入口參數(shù)就是:系統(tǒng)的分頻、使用OSC還是PLL、OSC時鐘源選擇、外接晶體頻率,這四種來完成設備的時鐘,例如: /* SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_XTAL_16MHZ SYSCTL_OSC_MAIN) */ 最后使能相應的功能即可。(關于其時鐘配置的參數(shù)詳細講解見)。 在配置好系統(tǒng)的時鐘之后,根據(jù)需要的外設功能進行相應的使能: /* SysCtlPeripheralEnable(uint32_t ui32Peripheral) */ 其中的入口參數(shù)為SYSCTL_PERIPH_GPIOA、SYSCTL_PERIPH_PWM1、SYSCTL_PERIPH_TIMER1等等。 注意:32的系統(tǒng)頻率的配置是固定的,定在了不同的總線的使能函數(shù),所以不同的外設可以說是“不共用”系統(tǒng)時鐘的,而TI是先于外設使能前進行自己時鐘配置,然后才使能所需外設,且“公用”系統(tǒng)時鐘。 GPIO相關說完時鐘和系統(tǒng)配置,下面簡紹基本的GPIO口的配置。
GPIO的功能大致上還是和32的類似,可輸出高低電平、UART通信、還可以模擬一些簡單的通信接口,如SPI,IIC等。一般工作模式有以下幾種: 浮空輸入 上拉輸入 下拉輸入 模擬輸入 開漏輸出 推挽輸出 復用推挽輸出 復用開漏輸出
一般GPIO在復位之后都有一個默認的方向,為了安全起見,都是默認為輸入模式,廢話不多說,直接進入配置: 首先是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外設 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); */
不難看出,配置32和TI的方式就是不一樣的,32的GPIO是用結構體進行配置,TI則使用函數(shù)來進行配置。TI的普通配置只需要進行GPIO外設使能和方向控制即可。也不是說前面說到的功能模式就不能配置了,如果有需要可以進行其他類型的配置。 如果要進行端口高低電平的輸出控制,32和TI也是一樣的調(diào)用函數(shù)來進行配置,分別是: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(低電平時候為0,但是高電平時候不是1,而是GPIO_PIN_x)。例如PF1輸出高電平 : GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
如果想進行其他端口詳細的配置情況可以見相關手冊資料,其中端口復用放在后面各功能實現(xiàn)時候講。 通用定時器相關TI定時器簡介: TI定時器呢,主要分為12個大的定時器模塊(GPTM),每個定時器模塊又分為定時器A和定時器B,所以總共有24個定時器。這12個大的定時器的屬性分為16/32位的GPTM塊和32/64位塊,其中各6塊。每個16/32位的定時器塊,提供2路16位的定時器/計數(shù)器(即定時器A和定時器B),所以通俗來說就是定時器A或B單獨配置時候就是12個16位的定時器,級聯(lián)起來配置就是6個32位的定時器。同樣的,32/64位的塊就是12個32位的定時器,級聯(lián)時候就變成6個64位的定時器。 功能說明: 每個 GPTM 模塊的主要元件包括兩個自由運行的遞增/遞減計數(shù)器(稱作 Timer A 和 Timer B)、兩個預分頻器寄存器、兩個匹配寄存器、兩個預分頻器匹配寄存器、兩個影子寄存器、兩個加載/初始化寄存器以及與它們相關的控制功能。 接著來,該單片機的定時器和32的有點不同,特別是計數(shù)控制計數(shù)的寄存器。配置了32的定時器之后,定時器開始計數(shù),當計數(shù)達到重裝載值時候產(chǎn)生中斷,之后會重新“自動”裝載計數(shù)值,但是Ti卻并非如此,是否自動裝載計數(shù)值是需要在配置時候進行設置的,官方一點的來說就是:單次觸發(fā)/周期定時器模式。 相關定時器的功能如下: 接著進入配置對比: 首先還是先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);//單次計數(shù)模式 TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);//周期性計數(shù)模式 TimerLoadSet(TIMER0_BASE, 2222222- 1);//設定預裝栽值 IntEnable(INT_TIMER0A); //使能TIMER0A TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //TIMEOUT標志位觸發(fā)中斷 //TIMER0A開始計數(shù),當計數(shù)值等于TimerLoadSet,觸發(fā)中斷 */ 同GPIO口的配置一樣的,32的配置還是結構體類型的配置,TI還是調(diào)用函數(shù)進行配置。 PWM模式: 通用定時器支持簡單的PWM生成模式。在 PWM 模式中,定時器被配置為 24 位或 48 位遞減計數(shù)器,也就是說在定時器里面就有這個功能,配置好以后就直接輸出PWM,而不像32一樣配置好定時器之后還要一個TIM_SetCompare1()函數(shù)來進行PWM的輸出。 注意:除了前面介紹的不同點之后,與32還有一個很大的區(qū)別就是需要進行中斷的執(zhí)行相關功能時候,需要自己調(diào)用TimerIntRegister()函數(shù)來注冊中斷函數(shù)的名字,這樣中斷才有入口。如果不需要忽略即可。同時在使能中斷時候,和32一樣需要開啟一些中斷。 PWM相關PWM簡介: TI有2個PWM模塊,每個模塊由4個PWM發(fā)生器模塊和一個控制器模塊組成,一共可以產(chǎn)生16個PWM輸出。每個發(fā)生器模塊都能夠產(chǎn)生2個PWM信號,這兩個信號是基于同一個定時器和頻率,也可以配置成單獨產(chǎn)生信號。PWM模塊發(fā)生器產(chǎn)生的兩個信號為PWMA和PWMB。 以下為結構圖: 功能描述: - 時鐘選擇:系統(tǒng)時鐘和預分頻系統(tǒng)時鐘
- PWM定時器
每個PWM發(fā)生器中都有區(qū)別與通用定時器的定時器,在向下計數(shù)模式或向上/向下計數(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的:
/* //單獨配置的系統(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配置過程是結構體類型的,而TI則還是庫函數(shù)來進行配置的。有一點值得注意哦,TI在配置PWM時候不需要進行IO口的復用配置和映射等相關操作,只要找到對應的IO口就可以輸出信號。 UART通信相關微控制器的UART簡介: TI控制器配備了多達8路的UART,其基本功能和32差不多,具體功能可以參考32相關文檔
這部分我們先來看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); //復用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的端口映射到對應的GPIO口上,當然了,配置過程依舊是32為結構體,TI為調(diào)用庫函數(shù),但是在配置時候,32還要進行相關NVIC中斷配置,設置中斷優(yōu)先級,設置停止位等等。TI的配置就是以上那些函數(shù),其他的功能都是默認,如果需要可以進行自行查找配置。
這里還涉及到了端口復用。TI的端口復用很簡單,不用像32一樣先進行各種IO口的配置,直接用函數(shù)SCtlPeripheralEnable() 使能相關IO口的時鐘,GPIOPinConfigure() 函數(shù)里選擇相應復用的功能即可完成配置。 總的來說復用是在你要使用的外設功能函數(shù)里面進行的,不需要像32一樣拿出來進行配置來使用。 基于UART通信等相關知識點,可以先熟悉32的通信知識點后來使用TI,則會變得容易許多。
Word格式文檔51黑下載地址:
Ti-STM32-C51.rar
(1.57 MB, 下載次數(shù): 53)
2019-7-20 12:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|