久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4746|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32-IO-AFIO(復(fù)用功能IO和調(diào)試配置)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:91350 發(fā)表于 2015-10-29 17:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近在學(xué)習(xí)STM32,在BZ上一篇關(guān)于的串口通信文章里有這么一段代碼:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD| RCC_APB2Periph_AFIO,ENABLE);

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

STM32上有很多I/O口,也有很多的內(nèi)置外設(shè)想I2C,ADC,ISP,USART等,為了節(jié)省引出管腳,這些內(nèi)置外設(shè)基本上是與I/O口共用管腳的,也就是I/O管腳的復(fù)用功能。但是STM32還有一特別之處就是:很多復(fù)用內(nèi)置的外設(shè)的I/O引腳可以通過重映射功能,從不同的I/O管腳引出,即復(fù)用功能的引腳是可通過程序改變的。知道了這些我們就不難理解上面代碼的意思了,程序中用到的USART2外設(shè)的TX,RX分別對應(yīng)PA2,PA3,但是我的學(xué)習(xí)板上的PA2,PA3引腳接了其他設(shè)備,但是為了還要用USART2,“RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO”就打開了GPIOD重映射功能把USART2設(shè)備的TX,RX映射到PD5,PD6上,我們在這兩個引腳上接上MAX232串口芯片就可以使用USART2串口通信了。那為看官該問:“USART2是不是可以映射到任意管腳呢?”答案是否定的,它只能映射到固定的管腳,下圖是USART2重映射表


其他外設(shè)的重映射可以參考STM32100X手冊。


為了節(jié)省IO資源單片機(jī)會在一個IO上復(fù)用很多功能,一般的單片機(jī)用到 一個功能后就能再用兩外復(fù)用的功能了,這就體現(xiàn)出了STM32GPIO的強(qiáng)大功能了,我們用重映射的方法把其中一個外設(shè)映射到其他IO腳上,這樣就可以充分利用片內(nèi)資源!

也許你以為IO和AFIO是很簡單的,事實上有幾個誤區(qū)可能很多人都沒注意過,當(dāng)你只用現(xiàn)成的開發(fā)板來學(xué)習(xí)的時候,別人已經(jīng)幫你做好了資源分配,所有的外設(shè)功能學(xué)習(xí)都是照著別人給你的例程去做的,這才沒讓你覺得奇怪。

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

1、不是說使用了IO的復(fù)用功能就一定要啟動RCC_APB2Periph_AFIO的Clock的,參考下圖

只有使用了AFIO的事件控制寄存器、AFIO的重映射功能以及外部中斷(EXTI)控制寄存器才需要開啟AFIO的時鐘,STM32參考手冊從來沒說過使用IO的復(fù)用功能就一定要開啟AFIO時鐘,這是個誤區(qū)。

例如下面的,最常用的USART1,如果你的板子上,默認(rèn)用的就是PA9和PA10這兩個IO作為USART1的TX和TX,那么也就是沒有重映射,NoRemap,這種情況下根本不需要開啟AFIO時鐘,只要開啟USART1的外設(shè)時鐘就行了。這個實驗很簡單,自己試試就知道了。

2、從上面的圖你可以看到,原來USART1是可以放在PB6和PB7上面的,只不過幾乎所有的原理圖封裝中都不會在PB6和PB7的復(fù)用功能上標(biāo)出它可以當(dāng)USART1用,畢竟這種重映射的情況太多,幾乎所有外設(shè)都可以重映射,每個都標(biāo)出來會非常混亂。

STM32中,USART2的CTS、RTS、TX、RX和TIM2的CH1~CH4都在PA0~PA3上面,具體要如何選擇這兩個功能呢?

如果要使用USART2,就開始USART2的外設(shè)時鐘,如果要使用TIM2,就開啟TIM2的外設(shè)時鐘,如果你同時開啟,我也不知道會怎么樣,你可以自己試試,我覺得應(yīng)該是兩個都不能用。如果你一定要在PA0~PA3上使用這兩個功能,只能是時分復(fù)用。

正確的同時使用USART2和TIM2,應(yīng)該是使用上面提到的AFIO_Remap寄存器,將其中的一個重映射到其他IO上去,當(dāng)然這樣其他IO的本身的復(fù)用功能你就不能開啟了。

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

一、保留USART2在PA口上,將TIM2完全重映射(FullRemap)到其他IO上,或者,如果你不用RTS和CTS的硬件流控制,PA0(CTS)和PA1(RTS)上對應(yīng)的CH1和CH2是可以不用重映射的,只需要將Bit9:8改成10,也就是將CH3和CH4部分重映射到PB10和PB11上去,而CH1和CH2繼續(xù)保留在PA0和PA1上。但這種情況下,PB10和PB11上的I2C2和USART3就不能用了。

二、保留TIM2在PA口,將USART2重映射到PD口上,很明顯,當(dāng)TIM2完全不重映射時,USART2必須的信號線只有Clock不受影響,這種情況下也沒有部分映射可言了,必須將USART2完全重映射到PD3~PD7上,同樣的,這種情況下FSMC就不能用了。

  STM32上有很多I/O口,也有很多的內(nèi)置外設(shè)想I2C,ADC,ISP,USART等,為了節(jié)省引出管腳,這些內(nèi)置外設(shè)基本上是與I/O口共用管腳的,也就是I/O管腳的復(fù)用功能。但是STM32還有一特別之處就是:很多復(fù)用內(nèi)置的外設(shè)的I/O引腳可以通過重映射功能,從不同的I/O管腳引出,即復(fù)用功能的引腳是可通過程序改變的.讀到這里相信大家都應(yīng)該了解了端口重映射的一些概念了.原理上的東西不細(xì)說了,大家可以看手冊或者網(wǎng)上查,這方面的資料還是很多的.下面說說我的調(diào)試經(jīng)歷.

       上面說過,我用的CPU是STM32F103VCT6,說到這兒跟大家提一個小插曲.當(dāng)時在老板讓我換方案也就是CPU時,只說用VC的CPU,讓我把要買的CPU告訴負(fù)責(zé)買器件的人,由于我是第一次做,所以傻乎乎的寫了張紙給了對方.內(nèi)容是"STM32F103VC 10PCS"對方看了一眼就給我退了回來并加一句"型號不對,沒寫全".我沒明白,便也不好繼續(xù)問白癡問題,所以跑網(wǎng)上查,原來光這個CPU就不止一種.我們選用的是T6也就是LQFP封裝的工作環(huán)境為-40C -- 80C.所以說大家以后小心點兒 ..言規(guī)正傳.不知道是什么原因PCB制圖時把串口接到USART1上了,當(dāng)時也沒在意,等我把USART測試程序?qū)懞脽M(jìn)去硬件仿真時,串口給的是亂碼,我當(dāng)時就覺得奇怪.把程序檢查了好幾遍就是查不出問題來,以為是硬件有問題,但突然想到了STM有復(fù)用功能,心想會不會是這里有鬼?于是找來datasheet一看 ,真相大白

  
三個紅框交匯處.STM32F103VCT6 這個CPU的USART1接的是PB6/PB7 但是上電初始化后默認(rèn)功能并非是USART1.所以想要用串口功能 .必須用端口重映射..

   大家知道,STM32的單片機(jī)每個功能模塊有自己的時鐘系統(tǒng),所以要想要調(diào)用STM32單片機(jī)的功能模塊時必須先配置對應(yīng)時鐘,然后才能去操作相應(yīng)的功能模塊.端口重映射也一樣.如圖示:

重映射步驟為:

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);

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:444657 發(fā)表于 2020-11-12 14:21 | 只看該作者
我有個疑問,如果在程序運(yùn)行中。如果我復(fù)用了IO的第二功能,比如UART的RX,TX。由于程序的需要我要改用回普通的IO口咋辦?首先復(fù)位到IO功能,再次初始化嗎?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天干免费视频 | 国产免费又色又爽又黄在线观看 | 美女福利视频 | av黄色在线播放 | 一区中文字幕 | 免费久久精品视频 | 自拍偷拍精品 | 国产黄色精品 | 亚洲免费观看视频 | 婷婷久久五月 | 中文字幕一区二区三区四区 | 中文字幕成人免费视频 | 在线区 | 国产一区二区三区在线 | av一级在线观看 | 国产精品区一区二 | 日本特黄特色aaa大片免费 | 久久久久久久久久久爱 | 亚洲一区二区黄 | h视频在线播放 | 99精品久久久久久中文字幕 | 久久黄色| 亚洲男人天堂 | 国产欧美一区二区三区在线播放 | 日韩精品在线一区 | 亚洲第一色av | 亚洲一区二区三区在线视频 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 男人的天堂在线视频 | 亚洲国产黄色av | 欧美一级免费看 | 狠狠爱免费视频 | 欧美日韩专区 | 久久亚洲一区二区 | 国产成人一区二区三区精 | 亚洲一区二区三区四区在线观看 | 99精品在线观看 | 色精品视频 | 日韩在线观看网站 | 久草免费福利 | 日韩免费福利视频 |