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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14701|回復: 0
打印 上一主題 下一主題
收起左側(cè)

STM32 PWM輸出無信號的問題解決

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:98618 發(fā)表于 2016-1-22 01:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
作者:Miler Shao
近日,從ST MCU技術(shù)論壇看到一個貼子,覺得有點意思,拿過來稍作整理交流下。

發(fā)帖者問: 我利用stm32f103要做PWM輸出,利用timer1 GPIO PE8, PE9 做輸出程式碼如下,當我將PE8,9設(shè)定為out_pp時利用示波器可以看到波形輸出,但是一設(shè)定成AF_PP時,示波器就看不到任何輸出了!所以想要請問,我下面的程式碼哪裡出錯了呢?


從上面的繁體字和措辭不難看出發(fā)帖者極可能是港臺同胞。文字信息就這么多。另外發(fā)帖者還附加了下面一些程序配置代碼。

void Time_init(void)
{
TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1,DISABLE);
TIM1_TimeBaseInitStruct.TIM_Prescaler = 999;
TIM1_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM1_TimeBaseInitStruct.TIM_Period = 8;
TIM1_TimeBaseInitStruct.TIM_ClockDivision = 0x0;
TIM1_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStruct);
TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);
TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE);
TIM_Cmd(TIM1,ENABLE);
}

void pwm_init(void)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = 120;

TIM_OC1Init(TIM1,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 680;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);


TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 );

TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE);
TIM_Cmd(TIM1, ENABLE);
}

void GPIO_Configuration(void)
{
GPIO_InitTypeDef g;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, ENABLE);

g.GPIO_Pin = GPIO_Pin_9;
g.GPIO_Mode = GPIO_Mode_AF_PP;
g.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &g);

g.GPIO_Pin = GPIO_Pin_8 |GPIO_Pin_9 ;
g.GPIO_Mode = GPIO_Mode_AF_PP;
g.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &g);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);
}

int main(void)
{
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
Time_init();
pwm_init();
while(1);
}
void TIM1_CC_IRQHandler(void) //Interruptroutine
{
if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

GPIOE-> ODR ^= GPIO_Pin_9;
}
}


可以看出,發(fā)帖的代碼是基于ST 官方的傳統(tǒng)標準外設(shè)庫來寫的。上面代碼對TIM1ARRCCR1CCR2及相關(guān)捕捉中斷做了配置并使能。PE8/PE9做了GPIO及復用配置,開啟了TIM1復用腳的部分REMAP功能。針對上述問題,下面擬出幾點一起交流下。


1看看上面紅色的捕捉中斷代碼。竟然發(fā)現(xiàn)有對GPIOPE9的翻轉(zhuǎn)操作,感覺上他是希望利用捕捉中斷做GPIO翻轉(zhuǎn)來實現(xiàn)PWM輸出?

誠然,在使用有些其它品牌MCU芯片的時候,要實現(xiàn)PWM輸出可能不太方便,需借助定時中斷和GPIO翻轉(zhuǎn)來實現(xiàn)。這個過程實現(xiàn)起來往往并不是很方便,也有諸多局限性。對于ST MCU,不論STM8還是STM32所有芯片都能利用內(nèi)部的定時器輕松實現(xiàn)PWM輸出。只需做些基本配置,給定信號周期和脈寬就好,無須借助CPU中斷來協(xié)助實現(xiàn)。


2發(fā)帖者的描述信息中沒有給出完整的STM32芯片型號,不說完整芯片型號經(jīng)常是個麻煩事。STM329大系列,幾百個料號。其實不少問題是跟具體料號息息相關(guān)的。所以,如果通過郵件或網(wǎng)絡(luò)咨詢時,提供完整的信息是必須的。


上圖是STM32F1系列參考手冊里關(guān)于TIM1復用功能REMAP的表格。


發(fā)帖配置了PE8/PE9卻又只是做了PARTIAL REMAP, 結(jié)合上圖表格得知TIM1OC1/OC2輸出只能出現(xiàn)在PA8/PA9。不知怎么又扯到PE8/PE9了。如果用PE8PE9,那對應(yīng)的OC輸出應(yīng)該是OC1OC1N這對互補輸出,這跟OC1/OC2又并不一樣,而且還得做FULL REMAP操作才行。也就是說,按照他的配置,在PE口是看不到TIM1_CH1/2OC輸出的,具體到這里就是不能在PE口看到PWM輸出。


3發(fā)帖說當他把PE9GPIO模式配置為OUT_PP時能看到脈沖,配置為AF_PP時又看不到,這是怎么回事呢?

在標準庫里對GPIO輸出模式有相關(guān)定義,這里的OUT_PPAF_PP分別是指GPIO_MODE_OUT_PP和GPIO_Mode_AF_PP前者GPIO不做復用時的輸出配置;后者是指GPIO做復用輸出時的配置。

盡管發(fā)帖的代碼有點混亂,但他的定時器1的基本配置還是能工作的,導致捕捉中斷能進入。前面提過,在捕捉中斷里他做了PE9IO翻轉(zhuǎn)。作為普通GPIO口,即配置為GPIO_MODE_OUT_PP,當然能用示波器看到該腳翻轉(zhuǎn)的脈沖,但這并等同于來自STM32定時器硬件實現(xiàn)的PWM信號,純粹IO翻轉(zhuǎn)脈沖。而當PE9被配置為GPIO_Mode_AF_PP時,意味著它要輸出其它復用信號,而不是本身IO通道的信號。前面說了,按他現(xiàn)有配置,PWM輸出是到不了PE9的,此時看不到IO翻轉(zhuǎn)信號也就不難理解了。

下面是STM32F1系列GPIO管腳復用時的原理框圖


4發(fā)帖的代碼混亂還有個地方,那就是關(guān)于PWM的脈寬和信號周期的設(shè)置。上面的代碼里信號周期設(shè)置為8個預分頻時鐘,而2個通道的脈寬卻配置為120680個,即CCRARR大得多。按照這樣的配置,即使其它有關(guān)GPIO復用及REMAP的地方配置無誤,它也無法在相應(yīng)管腳看到PWM跳變脈沖。因為兩個通道都沒有電平翻轉(zhuǎn)的機會,輸出一定是個固定電平。具體是高還是低跟PWM輸出模式與CCR的值有關(guān)。經(jīng)常有人在參考庫代碼基礎(chǔ)上,機械地對個別數(shù)據(jù)一通神改,結(jié)果發(fā)現(xiàn)PWM出不來了。還比如,對DEADTIME參數(shù)的隨意修改,也會導致同樣問題。


5STM32F1系列是目前STM32 九大系列中推出得最早的,其有關(guān)管腳復用配置個人覺得是最啰嗦的,沒有后面推出的STM32F0F4F3等系列的配置簡潔。另外印象中STM32F1系列也是唯一沒有二級加密保護的芯片。如果可能的話,在新品選型時不一定要拘泥于STM32F1,其實STM32家族中有很多性價比很好的型號可以選擇。再就是對于初學者的STM32開發(fā),建議使用STM32CUBEMX做初始化配置。尤其涉及到管腳復用和重映射的地方,操作簡單快捷,不易出錯。也建議盡量使用ST官方推出CUBE固件庫,里面資源比傳統(tǒng)固件庫更為豐富。


6程序代碼的正確,終究離不開對原理的清晰理解。不論有多好、多方便的工具,它不論代替你對原理的理解和把握。

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产不卡视频 | 国产婷婷色一区二区三区 | 久久毛片 | 久久久精品 | 91精品国产一区二区 | 久久久激情视频 | 91亚洲精品在线观看 | 欧美精品在线一区 | 天天摸天天看 | 国产精品一区二区日韩 | 99精品99久久久久久宅男 | 亚洲精品电影网在线观看 | 日韩二区三区 | 中文字幕日韩欧美一区二区三区 | 国产小视频在线 | 成人久久18免费网站图片 | 欧美激情在线精品一区二区三区 | 国产网站久久 | 欧美成人一级 | 国产99免费 | 成人午夜看片 | 日日操夜夜操天天操 | 午夜免费在线 | 亚洲欧美视频 | 97热在线 | 99精品九九| 精品视频久久久 | 欧美黄视频| 久久免费精彩视频 | 亚洲国产精品一区二区第一页 | 伊人艹 | 三级成人在线观看 | 视频精品一区 | 日韩三级电影一区二区 | 欧美日韩精品在线免费观看 | 国产一区二区观看 | 成人免费看电影 | 一级爱爱片 | 日韩免费福利视频 | 亚洲一区在线播放 | 97精品超碰一区二区三区 |