http://www.javashuo.com/article/p-ylmejvrg-bv.htmlhtml
PWM其實沒有什麼,就是看着官方給的API,,,而後就是用唄數組
對了,其實對於RTOS SDK版本的開發能夠直接去參考非RTOS SDK的API 這個直接有例子函數
其實嵌入操做系統也沒有什麼,底層自帶的外設硬件功能該怎麼樣仍是怎麼樣,操做系統也不能改變什麼,,操做系統的存在只是去操做咱定義的函數,讓這些函數執行的時候快速的切換執行...測試
我直接說第三個參數ui
第三個參數是說要定義一個 這樣的數組 [n][3]spa
其實就是爲了能夠一次性配置多個引腳.....操作系統
一開始我在想一維的不行嗎.........給你多個引腳的寄存器地址不就能夠了????3d
可是呢官方給的配置PWM輸出的函數呢..每一個引腳都須要填三個參數....不清楚爲何指針
第一個參數填引腳的寄存器地址 寄存器地址好說,咱全部的配置引腳其實都是配置這個引腳的寄存器(若是你看過個人STM32帶你入坑系列)code
第二個參數 填寫這個管腳的複用值,這個值不同,這個引腳的功能就不同
而後我解釋一下,假設是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的佔空比