https://www.cnblogs.com/yangfengwu/p/11094085.html
PWM其實沒有什么,就是看着官方給的API,,,然后就是用唄
對了,其實對於RTOS SDK版本的開發可以直接去參考非RTOS SDK的API 這個直接有例子
其實嵌入操作系統也沒有什么,底層自帶的外設硬件功能該怎么樣還是怎么樣,操作系統也不能改變什么,,操作系統的存在只是去操作咱定義的函數,讓這些函數執行的時候快速的切換執行...
我直接說第三個參數
第三個參數是說要定義一個 這樣的數組 [n][3]
其實就是為了可以一次性配置多個引腳.....
一開始我在想一維的不行嗎.........給你多個引腳的寄存器地址不就可以了????
但是呢官方給的配置PWM輸出的函數呢..每個引腳都需要填三個參數....不清楚為什么
第一個參數填引腳的寄存器地址 寄存器地址好說,咱所有的配置引腳其實都是配置這個引腳的寄存器(如果你看過我的STM32帶你入坑系列)
第二個參數 填寫這個管腳的復用值,這個值不一樣,這個引腳的功能就不一樣
然后我解釋一下,假設是GPIO12管腳,,,說一下哈,記住就行,這是我看了很多資料才知道的....具體官方在哪里寫的,,我也沒有找到
記住哈
所以寫3就可以
還有一點注意這幾個
其實官方給咱們准備好了
好了可以清空腦子了 所以的到上面的文件去看就可以 想配置GPIO的復用功能
假設函數的有個參數是填寫復用功能,假設配置GPIO12作為普通GPIO 就填 FUNC_GPIO12
作為SPI就填 FUNC_HSPIQ_MISO
其實這是我納悶的...我想實現PWM 難道不就是使用普通的GPIO 官方的API內部直接設置這個GPIO的寄存器的相應位置,讓GPIO作為普通的不就完了...不明白...不明白...
還有第三個參數..
就是
這個也是我納悶的......給你了GPIO的寄存器地址了,直接操作寄存器不就可以了........why?????
假設控制GPIO5輸出PWM
第一需要GPIO5的寄存器地址
其實最全的是在
第二個參數,,咱輸出PWM肯定是讓GPIO5作為普通輸出,所以
第三個 填5就可以
uint32 pin_info_list[1][3]={PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5,5};
//引腳寄存器地址 復用功能 引腳標號GOIOXX 沒有對應的GPIO5宏定義,所以直接5 如果配置GPIO12 就寫12
由於第二個參數也是指針類型,所以咱需要定義一個數組,其實是因為最后一個參數
uint32 pin_info_list[1][3]={PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5,5};
uint32 duty[1]={100};//高電平時間是100us
我寫的是配置一個引腳,,如果配置兩個 GPIO5 和 GPIO12
uint32 pin_info_list[2][3]={{PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5,5} , {PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12,12} } ;
uint32 duty[2]={100,500};//GPIO5 高電平時間是100us GPIO12高電平時間是500us
下面初始化
pwm_init(1000, duty, 1, pin_info_list); 第一個我測試的...1000us的時候最好使,也就是1Khz,,,
我填10000 100hz 產生的周期是對的10000us 但是duty填什么都有問題......
然后啟動
pwm_init(1000, duty, 1, pin_info_list);//周期1000us 高電平時間100us 1 --就配置了一個管腳,因為數組是[1][3] pin_info_list--數組 pwm_start();
下載測試
現在燈是微微亮
好現在做個呼吸燈
首先要明白呼吸燈的原理
其實說白了就是控制燈的PWM周期不變,假設一開始占空比是0 輸出高電平時間是 0
然后慢慢的增加高電平的輸出時間直至達到和周期一樣 燈就會越來越亮,直至最亮了 因為全部輸出高電平了
然后慢慢的減小高電平的輸出時間直至0 燈就會越來越暗,直至滅
慢慢的那個就用個定時器做
然后在定時器里面控制輸出的占空比從0變到最大 再從最大變到 0 然后循環
為了程序簡潔修改下
大家自行測試吧....
然后注意幾個地方
以前的文檔這樣說的
現在的這樣說的...我不測試了哈...大家自己測測
好,下一節,咱用上位機控制Wi-Fi的引腳輸出PWM的占空比
https://www.cnblogs.com/yangfengwu/p/11102026.html