下面跟你們說一下STM32單片機的端口重映射,由於是以本身爲實例.這裏是以USART1的重映射爲例..測試
由於我要一個TFT_LCD屏的主控板,考慮到FSMC 我選用了STM32F103VCT6 型號的CPU,一不當心串口接到USART1上了.由於在調程序時才發現錯了,沒得辦法,只能經過端口重映射來解決.可是之前沒用過端口重映射,只聞其名,未用其身,因此..呵呵 ...只能從頭去看了.調試
STM32上有不少I/O口,也有不少的內置外設想I2C,ADC,ISP,USART等,爲了節省引出管腳,這些內置外設基本上是與I/O口共用管腳的,也就是I/O管腳的複用功能。可是STM32還有一特別之處就是:不少複用內置的外設的I/O引腳能夠經過重映射功能,從不一樣的I/O管腳引出,即複用功能的引腳是可經過程序改變的.讀到這裏相信你們都應該瞭解了端口重映射的一些概念了.原理上的東西不細說了,你們能夠看手冊或者網上查,這方面的資料仍是不少的.下面說說個人調試經歷.ip
不知道是什麼緣由 PCB製圖時把串口接到USART1上了,當時也沒在乎,等我把USART測試程序寫好燒進去硬件仿真時,串口給的是亂碼,我當時就以爲奇怪.把程序檢查了好幾遍就是查不出問題來,覺得是硬件有問題,但忽然想到了STM有複用功能,心想會不會是這裏有鬼?因而找來datasheet 一看 ,真相大白it
三個紅框交匯處.STM32F103VCT6 這個CPU的USART1接的是PB6/PB7 可是上電初始化後默認功能並不是是USART1.因此想要用串口功能 .必須用端口重映射..io
你們知道,STM32的單片機每一個功能模塊有本身的時鐘系統,因此要想要調用STM32單片機的功能模塊時 必須先配置對應時鐘,而後才能去操做相應的功能模塊.端口重映射也同樣.如圖示:原理
重映射步驟爲:亂碼
1.打開重映射時鐘和USART重映射後的I/O口引腳時鐘, 配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);硬件
2.I/O口重映射開啓.map
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的 io 有3個功能一個是默認的 一個是複用 一個是重映射功能(這個其實也屬於複用) 若是配置成複用 則將使用第2個功能 若是配置成複用 同時 相應的重映射配置了 則將使用第3個功能 一般一個口的 複用+重映射有好多 不止兩個 這時候就看你使能哪一個設備了(哪一個被使能就用哪一個) 開復用 + 使能設備+ 是否重映射就能夠決定這個io口到底使用哪一個功能