久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機GPIO模擬I2C 寫EEPROM延時問題
[打印本頁]
作者:
hxdby
時間:
2023-7-29 20:00
標題:
單片機GPIO模擬I2C 寫EEPROM延時問題
大家好,
我用GPIO模擬I2C,和外部EEPROM通信,主要是單片機向EEPROM寫入數據,寫入時規格書要求必須延時5ms.
我現在的程序延時用的是嘀嗒延時,嘀嗒定時器延時應該也是阻塞式延時,我現在要做的就是消除程序里所有的阻塞式延時,其他的延時已經用定時器延改成了非阻塞了,就是這個寫EEPROM,我是怎么也沒想到比較好的非阻塞延時方式,如果用定時器來延時,沒有好的思路。
部分代碼如下,
void Write_EEPROM(uint8_t address,uint8_t data,uint8_t paddr) //寫數據到EEPROM
{
IIC_GPIO_Start();
IIC_WriteOneByte(paddr);
IIC_WriteOneByte(address);
IIC_WriteOneByte(data);
IIC_GPIO_Stop();
Systick_delay_ms(5); //此處寫完后延時5ms,用的是阻塞式延時,怎么改成非阻塞延時?
}
希望得到各位的幫助,謝謝
作者:
Hephaestus
時間:
2023-7-31 06:53
非阻塞就要把CPU控制權交給其他任務執行,最簡單的做法是上RTOS。
作者:
liyonghua111
時間:
2023-7-31 12:46
你可以使用一個狀態機和定時器中斷來實現非阻塞延時。在這種情況下,你需要將寫EEPROM的過程分解為幾個步驟,并為每個步驟定義一個狀態。然后,你可以在定時器中斷服務程序中改變狀態。
以下是一個簡單的示例:
c
typedef enum {
STATE_IDLE,
STATE_START,
STATE_WRITE_PADDR,
STATE_WRITE_ADDRESS,
STATE_WRITE_DATA,
STATE_STOP,
STATE_DELAY
} State;
volatile State state = STATE_IDLE;
uint8_t address, data, paddr;
void TIMx_IRQHandler(void) // 定時器中斷服務程序
{
if (TIM_GetITStatus(TIMx, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIMx, TIM_IT_Update);
switch (state)
{
case STATE_IDLE:
break;
case STATE_START:
IIC_GPIO_Start();
state = STATE_WRITE_PADDR;
break;
case STATE_WRITE_PADDR:
IIC_WriteOneByte(paddr);
state = STATE_WRITE_ADDRESS;
break;
case STATE_WRITE_ADDRESS:
IIC_WriteOneByte(address);
state = STATE_WRITE_DATA;
break;
case STATE_WRITE_DATA:
IIC_WriteOneByte(data);
state = STATE_STOP;
break;
case STATE_STOP:
IIC_GPIO_Stop();
state = STATE_DELAY;
break;
case STATE_DELAY:
// 延時5ms后,返回到空閑狀態
static int delayCounter = 0;
if (++delayCounter >= 5)
{
delayCounter = 0;
state = STATE_IDLE;
}
break;
}
}
}
void Write_EEPROM(uint8_t _address, uint8_t _data, uint8_t _paddr)
{
// 如果當前狀態為空閑,則開始寫入過程
if (state == STATE_IDLE)
{
address = _address;
data = _data;
paddr = _paddr;
state = STATE_START;
}
}
這樣,你就可以在主循環中調用Write_EEPROM函數,而不會阻塞其他任務。只有當寫入過程完成(即狀態返回到STATE_IDLE)時,才能開始新的寫入過程。
作者:
Y_G_G
時間:
2023-7-31 12:56
你選擇了模擬IIC,就注定了效率會變慢的
但這5mS是不需要這樣等待的
把等待低電平的部分重新寫一個函數
Write_EEPROM只管釋放SDA數據線和標志一個標志位,比如IIC_F,然后就函數返回
在主程序中增加一個一個檢測IIC_F的函數
進入函數后,先:
if(IIC_F & !SDA)
{
IIC_F = 0;
其它處理;
}
只有收到應答信號之后才進行對應的處理
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久1区
|
久久久精品高清
|
99精品视频一区二区三区
|
中文字幕在线视频一区二区三区
|
久久久精品久
|
亚洲国产一区二区三区在线观看
|
91激情视频
|
www.日本在线
|
亚洲国产二区
|
久草在线
|
成人免费观看男女羞羞视频
|
一本色道精品久久一区二区三区
|
国产精品自拍视频
|
一级片免费视频
|
97视频精品
|
国产福利在线播放
|
亚洲伊人精品酒店
|
国产成人免费视频网站视频社区
|
国产丝袜一区二区三区免费视频
|
午夜视频在线观看视频
|
网站黄色在线免费观看
|
91视频在线观看
|
欧美爱爱视频
|
黑人巨大精品欧美一区二区免费
|
国产日韩欧美激情
|
国产亚洲一区二区三区
|
宅男噜噜噜66一区二区
|
欧美激情视频网站
|
午夜理伦三级理论三级在线观看
|
久草视频观看
|
国内精品视频在线观看
|
精品久久久久久久久久
|
成人精品一区
|
美女视频网站久久
|
99精品网站
|
亚洲一区 中文字幕
|
一区二区在线
|
欧美久久久久久久久中文字幕
|
久久成人精品视频
|
精品无码久久久久国产
|
亚洲自拍偷拍av
|