我主要是最近看ACfly的代碼時,發現他有的工程的文件的.s文件講道理是啟動文件不是STM32,而是TM4C123,我懷疑是TI的芯片,查了下果然是的,應該是電賽準備的。但是這里可以看到換成其他芯片也是有專門的啟動文件的。
從51單片機到STM32再到TM4C123
目錄
系統時鐘
GPIO相關
通用定時器相關
PWM相關
UART通信相關
寫在前面:
進入TI的學習,說明STM32 已經掌握的差不多了,沒有掌握的很好也沒關系,正好兩塊單片機對比著學習更能加深映像。這篇只是簡單的介紹TI,篇幅比較短比,主要還是敘述了32和TI的不同的地方,相似的就沒有再寫出來,不能完全的拿來當作學習資料。
一點學習TI的建議:
TI主要學習還是通過北航出版的《嵌入式系統教程——基于TivaC系列 ARM Cortex—M4微控制器》為主資料,因為這個資料比較通俗易懂,如果不喜歡看電子版的,可以去圖書館借這本書,還有一本配套的書,忘記叫啥名字了,但是想借的話直接圖書館檢索TM4C123GH6PM就可以找到,這本書主要還是純文字教你怎么配置相應功能和相應項目的思路。其次,除了北航的那本書,配套的資料還應該有《TM4C1233H6PM數據手冊中文版》、中英文版本的《TM4CDriver_Library》,數據手冊的話主要就是了解相關外設功能,以及對應映射引腳查找。《TM4CDriver_Library》主要是API文檔,因為TI不同于32,TI的函數的入口參數無法通過像32一樣的方法查找選擇合適的參數,所以,該文檔就很有作用,對于一個函數,可以通過該文檔進行查找,找到函數所在的位置,有詳細的關于該函數的講解,可以了解該功能,同時還有入口參數的例子,若要選擇其他入口參數,則復制該參數,在程序文件里面查找定義的位置,就可以看到附近還有同類的參數,選擇需要的參數即可。
對于單片機的定時,那是一部分很重要的東西,這其中就有以分資料單獨講怎么配置各種定時器,實現不同功能,有例程,《TM4C123G定時器》就是一份資料,學習定時器的時候對照著來,會比較容易很多。
當然了,網上還有很多人的學習記錄博客,這些也是很有用的資料,因為學習TI,就是要知道怎么用,怎么配置相關程序,博客就解決了這類問題。CSDN上面這一類型的TI教程不多,懶得找的話可以來找我拷貝。
系統時鐘
對于51單片機來說,在書寫程序時候是不需要進行系統的時鐘函數的配置的,直接由晶振電路來提供。
如圖所示,直接是32和TI的系統時鐘框圖
32系統時鐘
TI系統時鐘
對于32 的時鐘來說,常用的時鐘主要分為AHB和APB兩大部分,且系統時鐘不需要自己來配置。
/*
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);
*/
每個部分對應多大的頻率,對應的定時器編號,串口編號也已經設定好。所以,在使用相對應的功能時候直接在這兩類里面進行查找然后使能外設就可以用了,例如使用GPIO、定時器等功能時候直接用函數里面的參數來查找:
/*
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能 GPIOA 時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口
*/
然而,對于TI來說,系統的時鐘也是分為AHB和APB兩種,但是在配置時候可進行自由選擇(由于初入TI,對這里沒有仔細學習,感興趣的可以了解),但是配置時鐘時候,可以只需要運用“SysCtlClockSet()”函數來自己來設定,不像32一樣直接規定了不同外設用不同的頻率。函數的入口參數就是:系統的分頻、使用OSC還是PLL、OSC時鐘源選擇、外接晶體頻率,這四種來完成設備的時鐘,例如:
/*
SysCtlClockSet ( SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_XTAL_16MHZ SYSCTL_OSC_MAIN )
*/
最后使能相應的功能即可。(關于其時鐘配置的參數詳細講解見)。
在配置好系統的時鐘之后,根據需要的外設功能進行相應的使能:
/*
SysCtlPeripheralEnable(uint32_t ui32Peripheral)
*/
其中的入口參數為 SYSCTL_PERIPH_GPIOA 、 SYSCTL_PERIPH_PWM1、 SYSCTL_PERIPH_TIMER1 等等。
注意:32的系統頻率的配置是 固定的,定在了不同的總線的使能函數 ,所以不同的外設可以說是“不共用”系統時鐘的,而TI是先于外設使能前進行自己 時鐘 配置,然后才 使能 所需外設,且“公用”系統時鐘。
GPIO相關
說完時鐘和系統配置,下面簡紹基本的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則使用函數來進行配置。TI的普通配置只需要進行GPIO外設使能和方向控制即可。也不是說前面說到的功能模式就不能配置了,如果有需要可以進行其他類型的配置。
如果要進行端口高低電平的輸出控制,32和TI也是一樣的調用函數來進行配置,分別是:GPIO_SetBits(GPIOE,GPIO_Pin_5); 和 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);
注意:TI的輸出高低電平使用的是同一個函數GPIOPinWrite(),對于32則使用的是兩個函數:GPIO_SetBits()和GPIO_ResetBit()即可輸出高低電平。TI呢,則不是這樣的,就連入口參數也不是和32一樣那么簡單,GPIOPinWrite()入口參數就有三個,分別是GPIO_PORTx_BASE,GPIO_PIN_x,和0(低電平時候為0,但是高電平時候不是1,而是GPIO_PIN_x)。例如PF1輸出高電平?。?p>GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
如果想進行其他端口詳細的配置情況可以見相關手冊資料,其中端口復用放在后面各功能實現時候講。
通用定時器相關
TI定時器簡介:
TI定時器呢,主要分為12個大的定時器模塊(GPTM),每個定時器模塊又分為定時器A和定時器B,所以總共有24個定時器。這12個大的定時器的屬性分為16/32位的GPTM塊和32/64位塊,其中各6塊。每個16/32位的定時器塊,提供2路16位的定時器/計數器(即定時器A和定時器B),所以通俗來說就是定時器A或B單獨配置時候就是12個16位的定時器,級聯起來配置就是6個32位的定時器。同樣的,32/64位的塊就是12個32位的定時器,級聯時候就變成6個64位的定時器。
功能說明:
每個 GPTM 模塊的主要元件包括兩個自由運行的遞增/遞減計數器(稱作 Timer A 和 Timer B)、兩個預分頻器寄存器、兩個匹配寄存器、兩個預分頻器匹配寄存器、兩個影子寄存器、兩個加載/初始化寄存器以及與它們相關的控制功能。
接著來,該單片機的定時器和32的有點不同,特別是計數控制計數的寄存器。配置了32的定時器之后,定時器開始計數,當計數達到重裝載值時候產生中斷,之后會重新“自動”裝載計數值,但是Ti卻并非如此,是否自動裝載計數值是需要在配置時候進行設置的,官方一點的來說就是:單次觸發 /周期定時器模式。
相關定時器的功能如下:
接著進入配置對比:
首先還是先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);//單次計數模式
TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);//周期性計數模式
TimerLoadSet(TIMER0_BASE, 2222222- 1);//設定預裝栽值
IntEnable(INT_TIMER0A); //使能TIMER0A
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //TIMEOUT標志位觸發中斷
//TIMER0A開始計數,當計數值等于TimerLoadSet,觸發中斷
*/
同GPIO口的配置一樣的,32的配置還是結構體類型的配置,TI還是調用函數進行配置。
PWM模式:
通用定時器支持簡單的PWM生成模式。在 PWM 模式中,定時器被配置為 24 位或 48 位遞減計數器,也就是說在定時器里面就有這個功能,配置好以后就直接輸出PWM,而不像32一樣配置好定時器之后還要一個TIM_SetCompare1()函數來進行PWM的輸出。
注意:除了前面介紹的不同點之后,與32還有一個很大的區別就是需要進行中斷的執行相關功能時候,需要自己調用TimerIntRegister()函數來注冊中斷函數的名字,這樣中斷才有入口。如果不需要忽略即可。同時在使能中斷時候,和32一樣需要開啟一些中斷。
PWM相關
PWM簡介:
TI有2個PWM模塊,每個模塊由4個PWM發生器模塊和一個控制器模塊組成,一共可以產生16個PWM輸出。每個發生器模塊都能夠產生2個PWM信號,這兩個信號是基于同一個定時器和頻率,也可以配置成單獨產生信號。PWM模塊發生器產生的兩個信號為PWMA和PWMB。
以下為結構圖:
功能描述:
時鐘選擇:系統時鐘和預分頻系統時鐘
PWM定時器
每個PWM發生器中都有區別與通用定時器的定時器,在向下計數模式或向上/向下計數模式。
PWM比較器
每個PWM發生器都有兩個比較器。具體功能和32一樣就不再累贅。
PWM信號發生器
初始化及配置:
首先還是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的:
/*
//單獨配置的系統時鐘
SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);
//配置引腳為PWM功能
syslPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinConfigure(GPIO_PF3_M1PWM7);
GPIOPinTypePWM(GPIOF, Pin3);
//配置 PWM1 Generator3·發生器
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 發生器模塊
PMGenEnable(PWM1_BASE, PWM_GEN_3);
*/
還是和前面一樣,32的PWM配置過程是結構體類型的,而TI則還是庫函數來進行配置的。有一點值得注意哦,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);//
上一篇:STM32程序的燒錄方式 與 ISP一鍵下載
下一篇:STM32之中斷與事件---中斷與事件的區別
推薦閱讀
史海拾趣
隨著技術的不斷進步,DATEL Inc.的數據采集產品逐漸在軍事領域找到了用武之地。公司接到一項為軍方開發高精度數據采集系統的訂單。經過深入研究和反復測試,DATEL Inc.成功交付了一套滿足軍方嚴苛要求的數據采集系統,為軍方提供了準確、可靠的數據支持。這一突破不僅為DATEL Inc.贏得了軍方的高度認可,也進一步擴大了公司在軍事領域的影響力。
FEI Microwave Inc公司自成立以來,始終致力于微波技術的創新與發展。在早期,公司研發團隊成功研發出了一款具有突破性的微波收發模塊,該模塊以其高頻率、低噪聲和出色的穩定性迅速在市場上嶄露頭角。隨著技術的不斷完善,FEI Microwave Inc公司逐漸在微波通信領域建立了自己的技術壁壘,成為業界的佼佼者。
博流智能科技始創于2016年,由一群來自硅谷頂級芯片公司的創始團隊組成。他們憑借在移動通訊及物聯網技術領域的深厚積累,以及對未來科技趨勢的敏銳洞察,決定投身于新一代物聯網集成電路芯片的研發。初創時期,公司面臨著資金、技術和市場等多重挑戰,但團隊憑借堅定的信念和不懈的努力,逐步克服了困難,為公司的長遠發展奠定了堅實基礎。
在發展過程中,ACCUTEK公司始終注重品牌建設和品質提升。公司投入大量資源用于品牌推廣和市場宣傳,提高了品牌知名度和美譽度。同時,公司還建立了嚴格的質量管理體系和售后服務體系,確保每一臺出廠的設備都能達到客戶的要求和期望。這些舉措有效地提升了公司的市場競爭力,贏得了更多客戶的信任和支持。
ACCUTEK公司成立于XXXX年,起初只是電子行業中的一家小型初創企業。創始人憑借對電子技術的深入理解和市場趨勢的敏銳洞察,決定專注于高精度數控設備的研發和生產。公司初期面臨著資金短缺、技術瓶頸和市場認可度低等挑戰,但憑借團隊的堅持和不懈努力,逐漸在市場中站穩腳跟,贏得了初步的客戶信任。
這些資料來自網上,以前用過的,有程序、文檔、ppt等,還有一個Protues軟件;大多是S51和AVR的。 可能有與網站其他網友的重復的內容,沒時間也不好校對了。 陸續找出來發到這里分享了!… 查看全部問答∨ |
|
Resetting factory default configuration... System ready! Preparing for download... 串口終端顯示到以上信息,就沒下文了 … 查看全部問答∨ |
|
各位老師們,幫忙解決下啊,很困惑, 我將電源S-100-5型號,將主板上面R27,R28,,R25,D17,C18,C29,C27,Q5元件拆掉了,在在R29的位置接一跟線,編號1,D10,D9交接位接根線,編號,2在R34的位置接根線,編號3,三根線構成一組 ...… 查看全部問答∨ |
|
新年伊始,在國內IT職業教育具有領先地位的北大青鳥APTECH對外宣布,推出其經典培訓課程ACCP軟件工程師的最新版本——ACCP4.0,并拋出“IT人才職業技能標尺”這一全新概念,市場上引起極大的轟動和陣陣漣漪,并受到社會各界的廣泛關注。北大青鳥APT ...… 查看全部問答∨ |
不知道哪位有經驗,談談怎樣可以提升SPI讀寫SD卡的速度?現在已經把時鐘設置到最大了,但是速度還是不理想,沒有具體測試能達到多少,但是感覺非常忙。希望高手沒不吝賜教。。。。。?!? 查看全部問答∨ |