通信電纜 網(wǎng)絡(luò)設(shè)備 無線通信 云計算|大數(shù)據(jù) 顯示設(shè)備 存儲設(shè)備 網(wǎng)絡(luò)輔助設(shè)備 信號傳輸處理 多媒體設(shè)備 廣播系統(tǒng) 智慧城市管理系統(tǒng) 其它智慧基建產(chǎn)品
沈陽芯碩科技有限公司
參 考 價 | 面議 |
產(chǎn)品型號
品 牌
廠商性質(zhì)代理商
所 在 地沈陽市
聯(lián)系方式:宣女士查看聯(lián)系方式
更新時間:2021-09-23 13:05:33瀏覽次數(shù):324次
聯(lián)系我時,請告知來自 智慧城市網(wǎng)在使用華大單片機(jī)時對GPIO操作是基礎(chǔ)的操作,即使這種操作如果不注意還是會掉到坑里去。
在使用華大單片機(jī)時對GPIO操作是基礎(chǔ)的操作,即使這種操作如果不注意還是會掉到坑里去。
例如:使用同一組GPIO端口中的兩個引腳(PA00和PA01)做輸出,PA00在主循環(huán)中改變輸出狀態(tài),PA01通過中斷方式改變輸出狀態(tài)。正常的情況應(yīng)該是PA00只在主循環(huán)中改變輸出狀態(tài),而PA01只會在中斷發(fā)生時改變輸出狀態(tài)。但是,隨著程序運行時間的加長或者在主循環(huán)中提高PA00輸出的頻率,會發(fā)現(xiàn)本應(yīng)該在中斷中完成狀態(tài)改變的PA01,個別時候狀態(tài)會不發(fā)生改變。而在中斷服務(wù)程序中設(shè)置斷點,進(jìn)行debug發(fā)現(xiàn)中斷可以正常進(jìn)入,也能正常改變PA01的輸出狀態(tài)。要想分析造成這個情況的原因可以從網(wǎng)上提供的DDL庫入手來分析。華大單片機(jī)M0+系列芯片在對GPIO端口輸出電平操作時,DDL庫提供了如下兩種方法:
方法1:
<p><font face="微軟雅黑" size="3">/*****************************************************************************
** brief GPIO IO輸出值寫入
**
** param [in] enPort IO Port口
** param [in] enPin IO Pin腳
** param [out] bVal 輸出值
**
** retval en_result_t Ok 設(shè)置成功
** 其他值 設(shè)置失敗 ******************************************************************************/
en_result_t Gpio_WriteOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin, boolean_t bVal)
{
SetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, bVal);</font></p><p><font face="微軟雅黑" size="3"> return Ok;
}</font></p>
方法2:
<p><font face="微軟雅黑" size="3">/*******************************************************************************
** brief GPIO IO設(shè)置
**
** param [in] enPort IO Port口
** param [in] enPin IO Pin腳
**
** retval en_result_t Ok 設(shè)置成功
** 其他值 設(shè)置失敗 ******************************************************************************/
en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
SetBit(((uint32_t)&M0P_GPIO->PABSET + enPort), enPin, TRUE);</font></p><p><font face="微軟雅黑" size="3"> return Ok;
}</font></p><p><font face="微軟雅黑" size="3">
</font></p><p><font face="微軟雅黑" size="3">/******************************************************************************
** brief GPIO IO清零
**
** param [in] enPort IO Port口
** param [in] enPin IO Pin腳
**
** retval en_result_t Ok 設(shè)置成功
** 其他值 設(shè)置失敗 ******************************************************************************/
en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
SetBit(((uint32_t)&M0P_GPIO->PABCLR + enPort), enPin, TRUE);</font></p><p><font face="微軟雅黑" size="3"> return Ok;
}</font></p>
方法1是對整個PxOUT寄存器進(jìn)行的操作,查看華大單片機(jī)用戶手冊關(guān)于此寄存器的說明; 當(dāng)PxOUT寄存器對應(yīng)位為1時,對應(yīng)的引腳輸出高電平,反之輸出低電平。
方法2是通過置位寄存器引腳對應(yīng)位的置1完成引腳輸出高電平的操作,寄存器說明。
通過清零寄存器引腳對應(yīng)位的置1完成引腳輸出低電平的操作,寄存器說明
如圖:
上述輸出不正常的現(xiàn)象是因為使用了方法1進(jìn)行的操作。在主循環(huán)中對PA00輸出狀態(tài)的改變通過PAOUT寄存器來完成,假如PORTA所有引腳都為低電平時,讓PA00輸出高電平,方法1的操作是把0X0001寫入到PAOUT寄存器就可以實現(xiàn)。在ARM的匯編指令中要把0X0001寫入到PAOUT必須借助于通用寄存器 (r0~r7)來實現(xiàn)。當(dāng)CPU剛完成0X0001移入到通用寄存器時,中斷發(fā)生,CPU會把通用寄存器保存起來,然后響應(yīng)中斷,在中斷中PA01輸出高電平PAOUT值為0X0002,之后退出中斷。退出中斷后,CPU會恢復(fù)中斷之前通用寄存器的值(0X0001),再繼續(xù)把通用寄存器的值存入到PAOUT。這時PAOUT的值是0X0001,只有PA00輸出高電平,而PA01沒有輸出高電平。這種現(xiàn)象就是華大MCU端口使用時的競爭-冒險現(xiàn)象。
在使用華大芯片的時候不希望這競爭-冒險現(xiàn)象出現(xiàn),通過方法2的操作*可以避免此現(xiàn)象的出現(xiàn)。因為方法2是對寄存器的位進(jìn)行操作,每次操作的時候只有對應(yīng)的位進(jìn)行置位或清零,其它位值為0的時候不影響輸出的結(jié)果 。
建議大家在開發(fā)的時候?qū)?span>GPIO端口輸出操作時,使用方法2的方式來操作。
您感興趣的產(chǎn)品PRODUCTS YOU ARE INTERESTED IN
智慧城市網(wǎng) 設(shè)計制作,未經(jīng)允許翻錄必究 .? ? ?
請輸入賬號
請輸入密碼
請輸驗證碼
請輸入你感興趣的產(chǎn)品
請簡單描述您的需求
請選擇省份
聯(lián)系方式
沈陽芯碩科技有限公司