99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

定義IO初始化結(jié)構(gòu)體

瑞薩MCU小百科 ? 來(lái)源:野火電子 ? 2025-07-16 16:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

歡迎回到我們的RA系列FSP庫(kù)開(kāi)發(fā)實(shí)戰(zhàn)指南頻道,下面我們將繼續(xù)講解“自己寫(xiě)庫(kù)——構(gòu)建庫(kù)函數(shù)雛形”部分:

8.2.5定義IO初始化結(jié)構(gòu)體

由上述IOPORT相關(guān)功能的枚舉類型我們可以知道,在對(duì)IOPORT模塊進(jìn)行初始化時(shí)需要根據(jù)情況配置它們。因此我們定義一個(gè)IOPORT初始化的結(jié)構(gòu)體類型IOPORT_Init_t,它的成員包括了由上述所有枚舉類型所聲明的變量,因此該結(jié)構(gòu)體類型的變量可以包含IOPORT的相關(guān)功能配置。

列表5:代碼清單8-4:ra_ioport.h文件

左右滑動(dòng)查看完整內(nèi)容

/* IOPORT 初始化結(jié)構(gòu)體類型定義 */


typedefstruct
{
IO_Port_tPort;
IO_Pin_tPin;
IO_Mode_tMode;
IO_Dir_tDir;
IO_OType_tOType;
IO_DriveCapability_tDrive;
IO_Level_tLevel;
IO_Pull_tPull;
} IOPORT_Init_t;

8.2.6編寫(xiě)IO操作函數(shù)

我們把IO操作函數(shù)的聲明和IO初始化函數(shù)的聲明都放在ra_ioport.h頭文件。

列表6:代碼清單8-5:ra_ioport.h文件

左右滑動(dòng)查看完整內(nèi)容

/* IO 操作函數(shù)(調(diào)用一次只能操作一個(gè) IO 引腳) */
uint32_tIOPORT_PinRead(IO_Port_t port, IO_Pin_t pin);
voidIOPORT_PinWrite(IO_Port_t port, IO_Pin_t pin, IO_Level_t?
→level);
voidIOPORT_PinToggle(IO_Port_t port, IO_Pin_t pin);
voidIOPORT_PinAccessEnable(void);
voidIOPORT_PinAccessDisable(void);


/* IO 初始化函數(shù)(調(diào)用一次只能初始化一個(gè) IO 引腳) */
voidIOPORT_Init(IOPORT_Init_t *ioport_init);

然后在ra_ioport.c源文件里面實(shí)現(xiàn)這些IO操作函數(shù)。

列表7:代碼清單8-6:ra6m5_ioport.c文件

左右滑動(dòng)查看完整內(nèi)容

/* 讀引腳電平 */


uint32_tIOPORT_PinRead(IO_Port_t port, IO_Pin_t pin)
{
/* Read pin level. */
returnR_PFS->PORT[port >>8].PIN[pin].PmnPFS_b.PIDR;
}


/* 寫(xiě)引腳電平 */
voidIOPORT_PinWrite(IO_Port_t port, IO_Pin_t pin, IO_Level_t level)
{
uint32_t pfs_bits =R_PFS->PORT[port >>8].PIN[pin].PmnPFS;//讀寄存器?
→PmnPFS


pfs_bits &= ~(uint32_t)0x1;//清零 PODR 位
R_PFS->PORT[port >>8].PIN[pin].PmnPFS= (pfs_bits | level);
}


/* 翻轉(zhuǎn)引腳電平 */
voidIOPORT_PinToggle(IO_Port_t port, IO_Pin_t pin)
{
uint32_t pfs_bits =R_PFS->PORT[port >>8].PIN[pin].PmnPFS;//讀寄存器?
→PmnPFS
pfs_bits ^= (uint32_t)0x1;//取反 PODR 位
R_PFS->PORT[port >>8].PIN[pin].PmnPFS= pfs_bits;
}


/* 引腳訪問(wèn)使能 */
voidIOPORT_PinAccessEnable(void)
{
R_PMISC->PWPR=0;///< Clear BOWI bit - writing to PFSWE bit?
→enabled
R_PMISC->PWPR= 1U << 6U;?///< Set PFSWE bit - writing to PFS register?
→enabled
}


/* 引腳訪問(wèn)禁止 */
voidIOPORT_PinAccessDisable(void)
{
R_PMISC->PWPR=0;///< Clear PFSWE bit - writing to PFS register?
→disabled
R_PMISC->PWPR= 1U << 7U;?///< Set BOWI bit - writing to PFSWE bit?
→disabled
}

8.2.7編寫(xiě)IO初始化函數(shù)

最后編寫(xiě)IOPORT初始化函數(shù)。

列表8:代碼清單8-7:ra_ioport.c文件

左右滑動(dòng)查看完整內(nèi)容

/* IOPORT 初始化函數(shù) */


voidIOPORT_Init(IOPORT_Init_t *ioport_init)
{
uint32_t pfs_bits =0;//不讀取寄存器 PmnPFS
if(ioport_init->Mode==IO_MODE_GPIO)//如果引腳用作普通 GPIO 功能
{
if(ioport_init->Dir==IO_DIR_INPUT)/* 用作輸入模式 */
{
pfs_bits |= (ioport_init->Pull) <Dir==IO_DIR_OUTPUT)/* 用作輸出模式 */
{
pfs_bits |= (ioport_init->Dir) <Level) <Mode) <Drive) <PORT[ioport_init->Port>>8].PIN[ioport_init->Pin].PmnPFS= pfs_
→bits;
}

8.2.8hal_entry入口函數(shù)

前一章節(jié)實(shí)驗(yàn)里有講過(guò),當(dāng)使用RTOS時(shí),程序從main函數(shù)開(kāi)始進(jìn)行線程調(diào)度;當(dāng)沒(méi)有使用RTOS時(shí),C語(yǔ)言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry函數(shù)。本章節(jié)實(shí)驗(yàn)的工程也是沒(méi)有選用RTOS的,因此,用戶程序是從hal_entry函數(shù)開(kāi)始執(zhí)行。

打開(kāi)“srchal_entry.c”文件,我們?cè)凇癶al_entry.c”文件中添加對(duì)頭文件“ra_ioport.h”的包含,然后在hal_entry函數(shù)里面編寫(xiě)我們的代碼。

以啟明6M5開(kāi)發(fā)板為例,RA6M5工程的hal_entry數(shù)代碼如下所示。

注解

啟明4M2開(kāi)發(fā)板和啟明2L1開(kāi)發(fā)板的用戶可直接打開(kāi)配套的“09_Register_MyLib”例程查看該代碼,限于篇幅,不在本章中貼出。

列表9:代碼清單8-8:hal_entry.c文件

左右滑動(dòng)查看完整內(nèi)容

/* IOPORT 模塊頭文件 (自己寫(xiě)庫(kù)——構(gòu)建庫(kù)函數(shù)雛形) */
#include"ioport/ra_ioport.h"


voidhal_entry(void)
{
/*TODO:add your own code here */


/* 調(diào)用取消寫(xiě)保護(hù)函數(shù) */
IOPORT_PinAccessEnable();


/* 使用 IOPORT 初始化結(jié)構(gòu)體和調(diào)用初始化函數(shù)來(lái)配置 PFS 寄存器 */
IOPORT_Init_t led_io_init;
led_io_init.Port = IO_PORT_04;
led_io_init.Pin = IO_PIN_00;
led_io_init.Mode = IO_MODE_GPIO;//普通 GPIO 模式,而不是復(fù)用功能模式或其他
的
led_io_init.Dir = IO_DIR_OUTPUT;
led_io_init.OType = IO_OTYPE_PP;
led_io_init.Drive = IO_DRIVE_LOW;
led_io_init.Level = IO_LEVEL_HIGH;//輸出高電平(LED 熄滅)
//LED_IO_Init.Pull = IO_NO_PULL; //端口方向處于輸出模式下是用不了上拉的,所以這
個(gè)屬性沒(méi)意義
IOPORT_Init(&led_io_init);//調(diào)用初始化函數(shù),進(jìn)行 LED1 引腳初始化
led_io_init.Pin = IO_PIN_03;//更換引腳號(hào)
IOPORT_Init(&led_io_init);//結(jié)構(gòu)體其他屬性不變,再次調(diào)用初始化函數(shù),進(jìn)行 LED2 引
腳初始化
led_io_init.Pin = IO_PIN_04;//更換引腳號(hào)
IOPORT_Init(&led_io_init);//結(jié)構(gòu)體其他屬性不變,再次調(diào)用初始化函數(shù),進(jìn)行 LED3 引
腳初始化


/** 此時(shí) 3 個(gè) LED 燈的引腳默認(rèn)輸出的是高電平,所以 3 個(gè) LED 燈都會(huì)默認(rèn)不亮
* 我們先打開(kāi)所有 LED 燈,然后在 while 循環(huán)里讓 LED1 閃爍:每秒鐘翻轉(zhuǎn)一次狀態(tài)
*/
IOPORT_PinWrite(IO_PORT_04, IO_PIN_00, IO_LEVEL_LOW);//點(diǎn)亮 LED1
IOPORT_PinWrite(IO_PORT_04, IO_PIN_03, IO_LEVEL_LOW);//點(diǎn)亮 LED2
IOPORT_PinWrite(IO_PORT_04, IO_PIN_04, IO_LEVEL_LOW);//點(diǎn)亮 LED3


while(1)
{
/* 使用函數(shù) IOPORT_PinToggle 翻轉(zhuǎn) LED1 引腳電平 */
IOPORT_PinToggle(IO_PORT_04, IO_PIN_00);
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
}


#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

8.3下載驗(yàn)證

編寫(xiě)好上述代碼,然后將程序編譯并下載到開(kāi)發(fā)板之后,按下復(fù)位按鍵來(lái)復(fù)位開(kāi)發(fā)板,可以觀察到實(shí)驗(yàn)現(xiàn)象與上一章的實(shí)驗(yàn)現(xiàn)象相同:開(kāi)發(fā)板上面除了電源指示燈之外的3個(gè)LED燈當(dāng)中有兩個(gè)燈常亮,還有一個(gè)燈在緩慢閃爍。閃爍著的LED燈為L(zhǎng)ED1,它每秒鐘(1000毫秒)便改變一次亮滅的狀態(tài)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64895
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5682

    瀏覽量

    104802
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    131

    瀏覽量

    11115
  • FSP
    FSP
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    7429

原文標(biāo)題:定義IO初始化結(jié)構(gòu)體——瑞薩RA系列FSP庫(kù)開(kāi)發(fā)實(shí)戰(zhàn)指南(21)

文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread自動(dòng)初始化詳解

    初始化函數(shù)不需要被顯式調(diào)用,只需要在函數(shù)定義處通過(guò)宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)啟動(dòng)過(guò)程中被執(zhí)行,非常的方便。 1 普通初始化 前面也講了,我們?cè)趯?xiě)單片機(jī)的程序時(shí),需要對(duì)硬件進(jìn)行
    的頭像 發(fā)表于 06-25 21:38 ?1.2w次閱讀
    RT-Thread自動(dòng)<b class='flag-5'>初始化</b>詳解

    自動(dòng)初始化機(jī)制原理詳解

    自動(dòng)初始化機(jī)制是指初始化函數(shù)不需要被顯式調(diào)用,只需要在函數(shù)定義處通過(guò)宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)啟動(dòng)過(guò)程中被執(zhí)行。這篇文章就來(lái)探索一下其中的奧秘, 簡(jiǎn)單理解其原理!
    的頭像 發(fā)表于 12-16 09:33 ?1422次閱讀
    自動(dòng)<b class='flag-5'>初始化</b>機(jī)制原理詳解

    LED實(shí)驗(yàn)中把結(jié)構(gòu)定義放在時(shí)鐘初始化后出現(xiàn)報(bào)錯(cuò)

    有人知道LED實(shí)驗(yàn)中,led.c文件中把結(jié)構(gòu)定義放在時(shí)鐘初始化后面,會(huì)報(bào)錯(cuò),這是什么原因呢?正常程序如下:GPIO_InitTypeDef GPIO_InitStructure
    發(fā)表于 03-23 04:37

    C51的結(jié)構(gòu)初始化編譯錯(cuò)誤

    8051的結(jié)構(gòu)初始化錯(cuò)誤,我查了下這種初始化是C99可以支持的,但在option中設(shè)置沒(méi)有C99模式選項(xiàng),怎么破?
    發(fā)表于 03-25 02:37

    定時(shí)器初始化結(jié)構(gòu)定義

    定時(shí)器初始化結(jié)構(gòu)定義為typedef struct{uint16_t TIM_Prescaler; uint16_t TIM_CounterMode; uint16_t TIM_Pe
    發(fā)表于 08-18 07:12

    【原創(chuàng)分享】變量的初始化技巧

    由于在嵌入式系統(tǒng)中必須考慮程序規(guī)模的問(wèn)題,因此,對(duì)程序中的變量的初始化也需要進(jìn)行慎重的考慮。在C語(yǔ)言中,基本數(shù)據(jù)結(jié)構(gòu)(字符型、整型)的初始化相對(duì)簡(jiǎn)單;數(shù)組、結(jié)構(gòu)
    發(fā)表于 09-08 15:28

    STM32f1單片機(jī)的HAL庫(kù)是如何去定義定時(shí)器相關(guān)的初始化結(jié)構(gòu)

    STM32F1定時(shí)器可分為哪幾類呢?STM32f1單片機(jī)的HAL庫(kù)是如何去定義定時(shí)器相關(guān)的初始化結(jié)構(gòu)的?
    發(fā)表于 11-23 07:39

    請(qǐng)問(wèn)STM32通用定時(shí)器初始化結(jié)構(gòu)定義是什么

    請(qǐng)問(wèn)STM32通用定時(shí)器初始化結(jié)構(gòu)定義是什么?
    發(fā)表于 11-23 06:56

    結(jié)構(gòu)初始化怎么才能在keil4中編譯通過(guò)呢

    結(jié)構(gòu)初始化怎么才能在keil4中編譯通過(guò)呢?有何解決辦法?
    發(fā)表于 12-20 07:58

    利用結(jié)構(gòu)數(shù)組方便地控制單片機(jī)IO相關(guān)資料推薦

    定義結(jié)構(gòu)typedef struct {GPIO_TypeDef *GPIOx;u8Pinx;} relay_io;初始化
    發(fā)表于 01-18 09:10

    USART初始化結(jié)構(gòu)詳解

    USART 初始化結(jié)構(gòu)詳解標(biāo)準(zhǔn)庫(kù)函數(shù)對(duì)每個(gè)外設(shè)都建立了一個(gè)初始化結(jié)構(gòu),比如USART_Ini
    發(fā)表于 02-22 06:08

    結(jié)構(gòu)數(shù)組的初始化

    ] = {3,4},[4] = {5,6},[2] = {7,8}, [0] = {9,10}};//首次見(jiàn)到的初始化方法,這樣賦值順序可自定義。但有什么用呢? for(i = 0 ; i
    發(fā)表于 05-21 15:24

    結(jié)構(gòu)定義、初始化和賦值

    type)的一類。結(jié)構(gòu)可以被聲明為變量、指針或數(shù)組等,用以實(shí)現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)同時(shí)也是一些元素的集合,這些元素稱為
    發(fā)表于 11-20 09:29 ?5.6w次閱讀

    STM32的IO口基本操作:初始化結(jié)構(gòu),設(shè)置系統(tǒng)時(shí)鐘,開(kāi)啟外設(shè)時(shí)鐘資料下載

    電子發(fā)燒友網(wǎng)為你提供STM32的IO口基本操作:初始化結(jié)構(gòu),設(shè)置系統(tǒng)時(shí)鐘,開(kāi)啟外設(shè)時(shí)鐘資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用
    發(fā)表于 03-29 16:49 ?17次下載
    STM32的<b class='flag-5'>IO</b>口基本操作:<b class='flag-5'>初始化</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>,設(shè)置系統(tǒng)時(shí)鐘,開(kāi)啟外設(shè)時(shí)鐘資料下載

    C語(yǔ)言指定初始化器解析及其應(yīng)用

    C90 標(biāo)準(zhǔn)要求初始化程序中的元素以固定的順序出現(xiàn),與要初始化的數(shù)組或結(jié)構(gòu)中的元素順序相同。但是在新標(biāo)準(zhǔn) C99 中,增加了一個(gè)新的特...
    發(fā)表于 02-07 11:28 ?2次下載
    C語(yǔ)言指定<b class='flag-5'>初始化</b>器解析及其應(yīng)用