1. 程式人生 > >STM32的複用時鐘的開啟和重對映功能

STM32的複用時鐘的開啟和重對映功能

IO口的複用

最近在學習STM32,在BZ上一篇關於的串列埠通訊文章裡有這麼一段程式碼:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);

當初是參考開發的子寫的一直對GPIOD或上“RCC_APB2Periph_AFIO”這句話的意思沒搞懂,通過這幾天在網上查詢資料和看手冊,終於高清楚了,不敢獨享,希望能對跟我一樣的新手有所幫助吧o(∩_∩)o...

一、

STM32上有很多I/O口,也有很多的內建外設,像I2C,ADC,ISP,USART等 ,為了節省引出管腳,這些內建外設基本上是與

I/O口共用管腳的,也就是I/O管腳的複用功能。但是STM32還有一特別之處就是:很多內建外設的I/O複用引腳可以通過重對映功能從不同的I/O管腳引出,即使用了複用功能的引腳是可通過程式改變的。

知道了這些我們就不難理解上面程式碼的意思了,程式中用到的USART2外設的TXRX分別對應PA2PA3,但是我的學習板上的PA2,PA3引腳接了其他裝置,但是為了還要用USART2

“RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO”就打開了GPIOD重對映功能USART2裝置的TXRX對映到PD5,PD6上,我們在這兩個引腳上接上MAX232串列埠晶片就可以使用

USART2串列埠通訊了。

各位看官該問:“USART2是不是可以對映到任意管腳呢?

答案是否定的,它只能對映到固定的管腳,下圖是USART2重對映表

 

其他外設的重對映可以參考STM32100X手冊。

二、

為了節省IO資源微控制器會在一個IO上覆用很多功能,一般來說,微控制器IO用到一個功能後就能再用外的複用功能(對應的外設),這就體現出了STM32 GPIO的強大了,我們用重對映的方法把其中一個外設對映到其他IO腳上,這樣就可以充分利用片內資源!

也許你以為IOAFIO是很簡單的,事實上有幾個誤區可能很多人都沒注意過,當你只用現成的開發板來學習的時候,別人已經幫你做好了資源分配,所有的外設功能學習都是照著別人給你的例程去做的,這才沒讓你覺得奇怪。

先問自己一個問題:STM32中,USART2TIM2是共用相同IO的,你如何決定這幾個IO到底是做USART2還是做TIM2呢?如果你要同時使用USART2TIM2,該怎麼辦?

1不是說使用了IO的複用功能就一定要啟動RCC_APB2Periph_AFIOClock,參考下圖

 

只有使用了AFIO的事件控制暫存器AFIO_EVCRAFIO的重對映功能(AFIO_MAPR)以及外部中斷(AFIO_EXTICRx)控制暫存器才需要開啟AFIO的時鐘STM32參考手冊從來沒說過使用IO的複用功能就一定要開啟AFIO時鐘,這是個誤區。

例如下面的,最常用的USART1,如果你的板子上,預設用的就是PA9PA10這兩個IO作為USART1TXRX,那麼也就是沒有重對映(No Remap)這種情況下根本不需要開啟AFIO時鐘,只要開啟USART1的外設時鐘就行了。這個實驗很簡單,自己試試就知道了。

2面的圖你可以看到,原來USART1是可以放在PB6PB7上面的,只不過幾乎所有的原理圖封裝中都不會在PB6PB7的複用功能上標出它可以當USART1用,畢竟這種重對映的情況太多,幾乎所有外設都可以重對映,每個都標出來會非常混亂。


STM32中,USART2CTSRTSTXRXTIM2CH1~CH4都在PA0PA3上面,具體要如何選擇這兩個功能呢?

如果要使用USART2,就要使能USART2的外設時鐘,同理,如果要使用TIM2,就開啟TIM2的外設時鐘,如果你同時開啟,我也不知道會怎麼樣,你可以自己試試,我覺得應該是兩個都不能用。如果你一定要在PA0~PA3上使用這兩個功能,只能是時分複用。

正確的同時使用USART2TIM2,應該是使用上面提到的AFIO_Remap暫存器,將其中的一個重對映到其他IO上去,當然這樣其他IO的本身的複用功能你就不能開啟了。



回到前面的問題,如果你不做重對映(Remap),你根本不可能同時在PA0~PA3同時使用這兩個外設,現在你的方案有兩種:

一、保留USART2PA口上,將TIM2完全重對映(Full Remap)到其他IO上,或者,如果你不用RTSCTS的硬體流控制,PA0(CTS)PA1(RTS)上對應的CH1CH2是可以不用重對映的,只需要將Bit98改成10,也就是將CH3CH4部分重對映到PB10PB11上去,而CH1CH2繼續保留在PA0PA1上。但這種情況下,PB10PB11上的I2C2USART3就不能用了。

二、保留TIM2PA口,將USART2重對映到PD口上,很明顯,當TIM2完全不重對映時,USART2所需的訊號線只有時鐘訊號Clock不受影響,這種情況下也沒有部分對映可言了,必須將USART2完全重對映到PD3PD7上,同樣的,這種情況下FSMC就不能用了(被USART2佔用)

三、

STM32上有很多I/O口,也有很多的內建外設想I2C,ADC,ISP,USART等 ,為了節省引出管腳,這些內建外設基本上是與I/O口共用管腳的,也就是I/O管腳的複用功能。但是STM32還有一特別之處就是:很多複用內建的外設的I/O引腳可以通過重對映功能,從不同的I/O管腳引出,即複用功能的引腳是可通過程式改變的.

讀到這裡相信大家都應該瞭解了埠重對映的一些概念了.原理上的東西不細說了,大家可以看手冊或者網上查,這方面的資料還是很多的.下面說說我的除錯經歷.

        上面說過,我用的ICSTM32F103VCT6 ,說到這兒跟大家提一個小插曲.當時在老闆讓我換方案也就是IC,只說用VCCPU,讓我把要買的CPU告訴負責買器件的人,由於我是第一次做,所以傻乎乎的寫了張紙給了對方.內容是"STM32F103VC  10PCS"對方看了一眼就給我退了回來並加一句"型號不對,沒寫全".我沒明白,便也不好繼續問白痴問題,所以跑網上查,原來光這個IC就不止一種.我們選用的是T6也就是LQFP封裝的 工作環境為-40C -- 80C.所以說大家以後小心點兒..

言規正傳.不知道是什麼原因PCB製圖時把串列埠接到USART1上了,當時也沒在意,等我把USART測試程式寫好燒進去硬體模擬時,串列埠給的是亂碼,我當時就覺得奇怪.把程式檢查了好幾遍就是查不出問題來,以為是硬體有問題,但突然想到了STM有複用功能,心想會不會是這裡有鬼?於是找來datasheet一看 ,真相大白


三個紅框交匯處.STM32F103VCT6 這個CPUUSART1接的是PB6/PB7, 但是上電初始化後預設功能並非是USART1.所以想要用串列埠功能.必須用埠重對映..

    大家知道,STM32的微控制器每個功能模組有自己的時鐘系統,所以要想要呼叫STM32微控制器的功能模組時 必須先配置對應時鐘,然後才能去操作相應的功能模組.埠重對映也一樣.如圖示:


重對映步驟為:

1.開啟重對映時鐘和USART重對映後的I/O口引腳時鐘,

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

 //使能對應IO口的時鐘,因為是複用功能所以還要使能AFIO時鐘

2.I/O口重對映開啟.

                    GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

3.配製重對映後的引腳: 這裡只需配置重對映後的I/OPB6,PB7,原來的不需要去配置PA9PA10.

                     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                          GPIO_Init(GPIOB, &GPIO_InitStructure);

                          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
                          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                          GPIO_Init(GPIOB, &GPIO_InitStructure);

      只需要這三步,串列埠就可以正常使用了,簡單吧但是我糾結了大半個小時才搞定的,好多事情都是說起來容易做起來難的,希望我以後多多進步.不要眼高手低,嗯 我正朝這個方向前進

補充:

1. AFIO的功能

 為了優化64腳或100腳封裝的外設數目,可以把一些複用功能重新對映到其他引腳上。設定複用重對映和除錯I/O配置暫存器(AFIO_MAPR)實現引腳的重新對映。這時,複用功能不再對映到它們的原始分配上。

    簡言之,AFIO實現了複用功能的重新對映

2.在什麼情況下,需要開啟AFIO時鐘?

 下圖,參考手冊中寫道對暫存器AFIO_EVCR, AFIO_MAPRAFIO_EXTICRX進行讀寫操作前,應當首先開啟AFIO的時鐘


 在資料手冊的引腳定義中(pin definitions),複用功能"Alternate functions"欄下分為兩欄:預設"Default"和重對映"Remap"。其中,在預設欄中的功能只需要開啟相應外設功能的時鐘,無需開啟AFIO時鐘(注意:一個引腳在一個時間段內只能使用一個外設功能)。而在重對映欄中的功能,則需要開啟相應外設功能的時鐘,並且開啟AFIO時鐘

簡言之,GPIO口使用了重對映欄中的外設功能,則需要開啟AFIO時鐘;只使用預設複用功能時,只開啟相應外設時鐘無需開啟AFIO時鐘。