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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14477|回復: 0
打印 上一主題 下一主題
收起左側

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

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

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


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

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


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


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

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


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


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


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


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

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

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

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


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


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


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

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

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜电影在线观看 | 91精品国产综合久久久久久蜜臀 | 国产精品精品视频 | 免费午夜电影 | 国产精品久久久久久久久久久久午夜片 | 欧美不卡在线 | 亚洲品质自拍视频 | 欧美性视频在线播放 | 成人av一区二区三区 | 亭亭五月激情 | 91精品国产综合久久久动漫日韩 | 男女羞羞网站 | 激情欧美一区二区三区 | 精品美女视频在免费观看 | 在线黄色影院 | 国产成人精品免费 | 欧美精品久久久久 | 日本一区二区三区在线观看 | 少妇久久久久 | 欧美精品一区二区在线观看 | 中文字幕欧美一区二区 | 一区二区三区四区在线视频 | 东方伊人免费在线观看 | 国产精品1区 | 精品免费国产一区二区三区四区 | 国产精品成人一区二区三区 | 成人依人 | 亚洲黄色国产 | 国产激情在线 | 男人视频网站 | 成人3d动漫一区二区三区91 | 日本欧美在线视频 | 欧美一区二不卡视频 | 欧美色综合一区二区三区 | 国产在线观看一区二区三区 | 免费午夜视频 | 黑人性hd| 色吊丝在线 | 日本黄色影片在线观看 | 国产精品观看 | 成人毛片在线视频 |