STM32串口的部分映射与完全映射
覺得不錯分享給大家,學習!
轉載地址:http://www.eeworld.com.cn/mcu/article_2017091234363.html
? ? ? ? ? ? ? ? http://blog.csdn.net/liucheng_34/article/details/48175505
?
以stm32的USART1來舉例
默認使用的是PA9為TX,PA10為RX,當需要開啟復用功能時,需要注意修改以下幾個地方的代碼
? ? ? 1 時鐘的開啟
? ? ?當使用復用功能后,就需要開啟復用時鐘RCC_APB2Periph_AFIO
?2 初始化引腳的不同,原來的是PA9,PA10,但是現在要初始化PB6,PB7,這一部分就不貼代碼了。
?
?3 調用GPIO_PinRemapConfig()函數
? ? ??
?
?
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);??
? ? USART1的重映射開啟
?
?
?
注意:GPIO_PinRemapConfig()函數的參數是不能隨便寫的,在《stm32固件庫使用手冊》里面給出了可用參數的列表
GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE); //USART3的復用功能完全重映射
? ? ? ?GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); //USART3的部分重映射
部分重映射和完全重映射有什么區別那?在網上我也沒找到確定的答案,但是建議開啟完全重映射,因為網上有資料說部分重映射在發送消息時候不正常(我自己沒有做實驗)
還需要注意,在開啟重映射功能之前一定要先查看一下自己的單片機是否支持重映射功能。
?
附:初始化串口的程序
?
void?USART1_Config(void)??
{??
????????GPIO_InitTypeDef?GPIO_InitStructure;??
????????USART_InitTypeDef?USART_InitStructure;??
??????????
????????/*?config?USART1?clock?*/??
??????
????????RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1?|?RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,?ENABLE);??
??????????
????????/*?USART1?GPIO?config?*/??
??????????
????????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);??
??????????
??????
????????????GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);??
????????//GPIO_AFIODeInit();??
????????/*?USART1?mode?config?*/??
????????USART_InitStructure.USART_BaudRate?=?115200;??
????????USART_InitStructure.USART_WordLength?=?USART_WordLength_8b;??
????????USART_InitStructure.USART_StopBits?=?USART_StopBits_1;??
????????USART_InitStructure.USART_Parity?=?USART_Parity_No?;??
????????USART_InitStructure.USART_HardwareFlowControl?=?USART_HardwareFlowControl_None;??
????????USART_InitStructure.USART_Mode?=?USART_Mode_Rx?|?USART_Mode_Tx;??
????????USART_Init(USART1,?&USART_InitStructure);???
????????USART_Cmd(USART1,?ENABLE);??
} ?
重映射步驟為:
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的 io 有3個功能 一個是默認的 一個是復用 一個是重映射功能(這個其實也屬于復用)
 如果配置成復用 則將使用第2個功能 如果配置成復用 同時 相應的重映射配置了 則將使用第3個功能
 通常一個口的 復用+重映射有好多 不止兩個 這時候就看你使能哪個設備了?
 開復用 + 使能設備+ 是否重映射 就可以決定這個io口 到底使用哪個功能
?
?
http://fly-top.blog.163.com/blog/static/172755112201271724947243/
總結
以上是生活随笔為你收集整理的STM32串口的部分映射与完全映射的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: stm32-USART1重映射
- 下一篇: stm32中断向量控制器
