1. 程式人生 > >stm32的復用與映射

stm32的復用與映射

pcs 配置 問題 stm32 學習 程序 所有 mode shee

摘自:https://blog.csdn.net/lincheng15/article/details/51789093

技術分享圖片

摘自:http://www.51hei.com/bbs/dpj-36242-1.html

技術分享圖片

技術分享圖片

其他外設的重映射可以參考STM32100X手冊。
為了節省IO資源單片機會在一個IO上復用很多功能,一般的單片機用到 一個功能後就能再用兩外復用的功能了,這就體現出了STM32 GPIO的強大功能了,我們用重映射的方法把其中一個外設映射到其他IO腳上,這樣就可以充分利用片內資源!

也許你以為IO和AFIO是很簡單的,事實上有幾個誤區可能很多人都沒註意過,當你只用現成的開發板來學習的時候,別人已經幫你做好了資源分配,所有的外設功能學習都是照著別人給你的例程去做的,這才沒讓你覺得奇怪。
先問自己一個問題:STM32中,USART2和TIM2是共用相同IO的,你如何決定這幾個IO到底是做USART2還是做TIM2呢?如果你要同時使用USART2和TIM2,該怎麽辦?

技術分享圖片

2、從上面的圖你可以看到,原來USART1是可以放在PB6和PB7上面的,只不過幾乎所有的原理圖封裝中都不會在PB6和PB7的復用功能上標出它可以當USART1用,畢竟這種重映射的情況太多,幾乎所有外設都可以重映射,每個都標出來會非常混亂。
STM32中,USART2的CTS、RTS、TX、RX和TIM2的CH1~CH4都在PA0~PA3上面,具體要如何選擇這兩個功能呢?
如果要使用USART2,就開始USART2的外設時鐘,如果要使用TIM2,就開啟TIM2的外設時鐘,如果你同時開啟,我也不知道會怎麽樣,你可以自己試試,我覺得應該是兩個都不能用。如果你一定要在PA0~PA3上使用這兩個功能,只能是時分復用。
正確的同時使用USART2和TIM2,應該是使用上面提到的AFIO_Remap寄存器,將其中的一個重映射到其他IO上去,當然這樣其他IO的本身的復用功能你就不能開啟了。

技術分享圖片

一、保留USART2在PA口上,將TIM2完全重映射(Full Remap)到其他IO上,或者,如果你不用RTS和CTS的硬件流控制,PA0(CTS)和PA1(RTS)上對應的CH1和CH2是可以不用重映射的,只需要將Bit9:8改成10,也就是將CH3和CH4部分重映射到PB10和PB11上去,而CH1和CH2繼續保留在PA0和PA1上。但這種情況下,PB10和PB11上的I2C2和USART3就不能用了。
二、保留TIM2在PA口,將USART2重映射到PD口上,很明顯,當TIM2完全不重映射時,USART2必須的信號線只有Clock不受影響,這種情況下也沒有部分映射可言了,必須將USART2完全重映射到PD3~PD7上,同樣的,這種情況下FSMC就不能用了。

STM32上有很多I/O口,也有很多的內置外設想I2C,ADC,ISP,USART等 ,為了節省引出管腳,這些內置外設基本上是與I/O口共用管腳的,也就是I/O管腳的復用功能。但是STM32還有一特別之處就是:很多復用內置的外設的I/O引腳可以通過重映射功能,從不同的I/O管腳引出,即復用功能的引腳是可通過程序改變的.讀到這裏相信大家都應該了解了端口重映射的一些概念了.原理上的東西不細說了,大家可以看手冊或者網上查,這方面的資料還是很多的.下面說說我的調試經歷.
上面說過,我用的CPU是STM32F103VCT6 ,說到這兒跟大家提一個小插曲.當時在老板讓我換方案也就是CPU時,只說用VC的CPU,讓我把要買的CPU告訴負責買器件的人,由於我是第一次做,所以傻乎乎的寫了張紙給了對方.內容是"STM32F103VC 10PCS"對方看了一眼就給我退了回來並加一句"型號不對,沒寫全".我沒明白,便也不好繼續問白癡問題,所以跑網上查,原來光這個CPU就不止一種.我們選用的是T6也就是LQFP封裝的 工作環境為-40C -- 80C.所以說大家以後小心點兒 ..言規正傳.不知道是什麽原因 PCB制圖時把串口接到USART1上了,當時也沒在意,等我把USART測試程序寫好燒進去硬件仿真時,串口給的是亂碼,我當時就覺得奇怪.把程序檢查了好幾遍就是查不出問題來,以為是硬件有問題,但突然想到了STM有復用功能,心想會不會是這裏有鬼?於是找來datasheet 一看 ,真相大白

技術分享圖片

技術分享圖片

重映射步驟為:
1.打開重映射時鐘和USART重映射後的I/O口引腳時鐘,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
2.I/O口重映射開啟.
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
3.配制重映射引腳, 這裏只需配置重映射後的I/O,原來的不需要去配置.
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);
只需要這三步,串口就可以正常使用了,簡單吧? 但是我糾結了大半個小時才搞定的,好多事情都是說起來容易做起來難的,希望我以後多多進步.不要眼高手低,嗯 我正朝這個方向前進.

技術分享圖片

stm32的復用與映射