日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

TKStudio-LPC1220_GPIO_LED工程后记

發(fā)布時(shí)間:2025/4/16 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TKStudio-LPC1220_GPIO_LED工程后记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2013年3月29日 23:42:24
  • 工程的main.c函數(shù)如下.
1: /* 2: 頭文件包含 3: */ 4: #include "lpc12xx_libcfg.h" 5:? 6: /********************************************************************************************************* 7: 宏定義 8: *********************************************************************************************************/ 9: #define LED_PORT LPC_GPIO1 /* LED引腳端口P1 */ 10: #define LED_PINS 2 /* LED引腳P1.2 */ 11:? 12: /********************************************************************************************************* 13: 全局變量定義 14: *********************************************************************************************************/ 15: static uint16_t GusGPIO1Port[7] = { /* GPIO1端口引腳類型 */ 16: IOCON_PIO_1_0, 17: IOCON_PIO_1_1, 18: IOCON_PIO_1_2, 19: IOCON_PIO_1_3, 20: IOCON_PIO_1_4, 21: IOCON_PIO_1_5, 22: IOCON_PIO_1_6 23: }; 24:? 25: void myDelay (uint32_t ulTime) //軟件延時(shí) 26: { 27: uint32_t i = 0; 28: 29: while (ulTime--) { 30: for (i = 0; i < 5000; i++); 31: } 32: } 33:? 34: void ledOn (void) // 點(diǎn)亮LED(輸出低電平) 35: { 36: GPIO_SetLowLevel(LED_PORT, LED_PINS, ENABLE); /* 輸出低電平,點(diǎn)亮LED */ 37: } 38:? 39:? 40: void ledOff (void)//Descriptions: 熄滅LED(輸出高電平) 41: { 42: GPIO_SetHighLevel(LED_PORT, LED_PINS, ENABLE); /* 輸出高電平,熄滅LED */ 43: } 44:? 45:? 46: void ledInit (void) //Descriptions: LED初始化 47: { 48: IOCON_PIO_CFG_Type PIO_mode; 49:? 50: IOCON_StructInit(&PIO_mode); /* 初始化端口模式 */ 51: PIO_mode.type = GusGPIO1Port[LED_PINS]; 52: IOCON_SetFunc(&PIO_mode); /* 設(shè)置LED引腳為GPIO功能 */ 53:? 54: GPIO_SetDir(LED_PORT, LED_PINS, GPIO_DIR_OUTPUT); /* 設(shè)置LED引腳為輸出 */ 55: 56: ledOff(); /* 熄滅LED */ 57: } 58:? 59:? 60: int main (void) // 運(yùn)行程序,觀察LED1狀態(tài).LED1以約200ms為周期閃爍 61: { 62: SystemInit(); /* 系統(tǒng)時(shí)鐘初始化 */ 63: SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_IOCON, ENABLE); /* IOCON模塊使能 */ 64: SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_GPIO1, ENABLE); /* GPIO1時(shí)鐘使能 */ 65:? 66: ledInit(); /* LED初始化 */ 67:? 68: while(1) { 69: ledOn(); 70: myDelay(100); 71: ledOff(); 72: myDelay(200); 73: } 74: } 75:? 76: #ifdef DEBUG 77: /********************************************************************************************************* 78: ** Function name: check_failed 79: ** Descriptions: 80: ** input parameters: 無(wú) 81: ** output parameters: 無(wú) 82: ** Returned value: 無(wú) 83: *********************************************************************************************************/ 84: void check_failed (uint8_t *file, uint32_t line) 85: { 86: while(1); /* Infinite loop */ 87: } 88: #endif

一.程序總體流程:

  • 系統(tǒng)時(shí)鐘初始化:
  • IOCON模塊使能
  • GPIO1時(shí)鐘使能
  • LED初始化
  • 死循環(huán):燈閃爍(一亮一滅)

二.硬件實(shí)物圖:

三.硬件原理圖

文件位置(E:\kpan\Desktop\LPC\硬件原理圖TinyM0_T12_ku\TinyM0 T12M原理圖與器件封裝庫(kù)\TinyM0 T12M原理圖)

(原理圖下載地址:【硬件資料】TinyM0 T12(M)原理圖與器件封裝庫(kù) [出處 2-25 2418次])

LED引腳的定義:

在main.c中有,

#define LED_PORT??? LPC_GPIO1?????????????????????????????????? /* LED引腳端口P1??????????????? */
#define LED_PINS??? 2?????????????????????????????????????????????????? /* LED引腳P1.2????????????????? */

在lpc12xx.h中有,

#define LPC_GPIO1???????????? ((LPC_GPIO_TypeDef?? *) LPC_GPIO1_BASE )

#define LPC_GPIO2_BASE??????? (LPC_AHB_BASE? + 0x20000)

#define LPC_AHB_BASE????????? (0x50000000UL)

這樣就可以對(duì)引腳P1.2進(jìn)行尋址了.


附:

在,(0x50000000UL) 中UL的意思是: unsigned long int.


四.部分程序解釋

(1)全局變量的定義.


static uint16_t GusGPIO1Port[7] = {???????????????????????????????????? /* GPIO1端口引腳類型??????????? */
??? IOCON_PIO_1_0,
??? IOCON_PIO_1_1,
??? IOCON_PIO_1_2,
??? IOCON_PIO_1_3,
??? IOCON_PIO_1_4,
??? IOCON_PIO_1_5,
??? IOCON_PIO_1_6
};


在lpc_12xxiocon.h中有,

#define IOCON_PIO_1_0???? ((uint16_t)0x0BC1 )?? /* PIO port1 type definition */

2013年3月30日 00:30:12


2013年3月30日 10:49:59

(2)


SystemInit();

系統(tǒng)初始化函數(shù),在system_lpc12xx.c中

(3)


??? SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_IOCON, ENABLE);???? /* IOCON模塊使能??????????????? */
??? SYS_ConfigAHBCLK(SYS_AHBCLKCTRL_GPIO1, ENABLE);????? /* GPIO1時(shí)鐘使能??????????????? */


系統(tǒng)_配置外圍模塊時(shí)鐘的使能,在Lpc12xx_syscrtl.c中

1: /** 2: * @brief 使能或者禁止系統(tǒng)和外圍時(shí)鐘. 3: Disable or enable system and peripheral clock. 4: * 5: * @param AHBClk_Type: 外圍模塊時(shí)鐘類型,AHB clock type. 6: * @param CmdState:使能/禁止 Enable or disable the clock for System or 7: * peripheral blocks. 8: * This parameter can be ENABLE or DISABLE. 9: * @retval None. 10: */ 11: void SYS_ConfigAHBCLK(uint32_t AHBClk_Type, FunctionalState CmdState) 12: { 13: if(CmdState) LPC_SYSCON->SYSAHBCLKCTRL |= AHBClk_Type; 14: else LPC_SYSCON->SYSAHBCLKCTRL &= ~(AHBClk_Type); 15: }

(4)


GPIO_SetLowLevel(LED_PORT, LED_PINS, ENABLE);?????????????????????? /* 輸出低電平,點(diǎn)亮LED????????? */

? GPIO_SetHighLevel(LED_PORT, LED_PINS, ENABLE);????????????????????? /* 輸出高電平,熄滅LED????????? */


設(shè)置GPIO口為高電平還是低電平,(根據(jù)原理圖,低電平點(diǎn)亮LED)

在Lpc12xx_gpio.c中,

1: /** 2: * @brief Set Value for bits that have output direction on GPIO port. 3: 設(shè)置GPIO端口的輸出值. 4: * @param pGPIO LPC_GPIOn 哪個(gè)GPIO 5: Port Number selection, should be LPC_GPIO0, LPC_GPIO1, LPC_GPIO2 6: * @param bitPosi n 哪個(gè)引腳號(hào) 7: bit position value, should be from 0 to 31, if it is oxff, set 'value' 8: * @param value 值:0/1 9: if bitPosi is from 0 to 31, Direction value, should be: 10: * - 0: no effect 11: * - 1: high level. 12: * if bitPosi is oxff, set the all 32-bits of register 13: * @return None 14: * 15: * Note: 16: * - For all bits that has been set as input direction, this function will 17: * not effect. 18: * - For all remaining bits that are not activated in bitValue (value '0') 19: * will not be effected by this function. 20: */ 21: void GPIO_SetHighLevel(LPC_GPIO_TypeDef* pGPIO, uint8_t bitPosi, uint32_t value) 22: { 23: CHECK_PARAM(PARAM_GPIOx(pGPIO)); 24:? 25: gpio_setvalue((uint32_t *)&pGPIO->SET, bitPosi, value); 26: } 27:? 28: /** 29: * @brief Clear Value for bits that have output direction on GPIO port. 30: * @param pGPIO Port Number selection, should be LPC_GPIO0, LPC_GPIO1, LPC_GPIO2 31: * @param bitPosi bit position value, should be from 0 to 31, if it is oxff, set 'value' 32: * @param value if bitPosi is from 0 to 31, Direction value, should be: 33: * - 0: No effect. 34: * - 1: low level. 35: * if bitPosi is oxff, set the all 32-bits of register 36: * @return None 37: * 38: * Note: 39: * - For all bits that has been set as input direction, this function will 40: * not effect. 41: * - For all remaining bits that are not activated in bitValue (value '0') 42: * will not be effected by this function. 43: */ 44: void GPIO_SetLowLevel(LPC_GPIO_TypeDef* pGPIO, uint8_t bitPosi, uint32_t value) 45: { 46: CHECK_PARAM(PARAM_GPIOx(pGPIO)); 47:? 48: gpio_setvalue((uint32_t *)&pGPIO->CLR, bitPosi, value); 49: }
  • 在這里的CHECK_PARM用于檢查某個(gè)函數(shù)的參數(shù)檢查,在Lpc12xx_libcfg.h中有,
1: #ifdef DEBUG 2: /******************************************************************************* 3: * @brief 這個(gè)函數(shù)用于某個(gè)函數(shù)的參數(shù)檢查,只在DEBUG模式下編譯時(shí)使用. 4: * The CHECK_PARAM macro is used for function's parameters check. 5: * It is used only if the library is compiled in DEBUG mode. 6: * @param[in] 表達(dá)式,如果表達(dá)式為假,調(diào)用參數(shù)檢查失敗(check_failed.)函數(shù) 7: * expr - If expr is false, it calls check_failed() function 8: * which reports the name of the source file and the source 9: * line number of the call that failed. 10: * - If expr is true, it returns no value. 11: * @return None 12: *******************************************************************************/ 13: #define CHECK_PARAM(expr) ((expr) ? (void)0 : check_failed((uint8_t *)__FILE__, __LINE__)) 14: #else 15: #define CHECK_PARAM(expr)

16: #endif /* DEBUG */

1: #define PARAM_GPIOx(n) ((((uint32_t *)n)==((uint32_t *)LPC_GPIO0)) || \ 2: (((uint32_t *)n)==((uint32_t *)LPC_GPIO1)) || \ 3: (((uint32_t *)n)==((uint32_t *)LPC_GPIO2))) 4:? 5: volatile uint32_t GPIOShadowPort[3];

這里的關(guān)鍵是調(diào)用了這個(gè)函數(shù):

1:? 2: /** 3: * @brief Set GPIO register. 4: * @param pGPIO LPC_GPIOn Port Number selection, should be LPC_GPIO0, LPC_GPIO1, LPC_GPIO2 5: * @param offset 寄存器的偏移值 Register offset value. 6: * @param bitPosi 操作比特位/直接設(shè)置值 bit position value, should be from 0 to 31, if it is oxff, set 'value' 7: * @param value 如果操作比特位,那么值為0/1 8: * if bitPosi is from 0 to 31, Direction value, should be: 9: * - 0: no mask. 10: * - 1: mask. 11: * if bitPosi is oxff, set the all 32-bits of register 12: * @return None 13: * 14: * Note: All remaining bits that are not activated in bitValue (value '0') 15: * will not be effected by this function. 16: */ 17: static void gpio_setvalue(uint32_t *p, uint8_t bitPosi, uint32_t value) 18: { 19: CHECK_PARAM(( bitPosi < 0x20 ) || ( bitPosi == 0xFF )); 20: CHECK_PARAM(( value == 0 ) || ( value == 1 )); 21: 22: if(bitPosi < 0x20){ 23: if (value) { 24: *(uint32_t *)p |= (0x1<<bitPosi); 25: } 26: else { 27: *(uint32_t *)p &= ~(0x1<<bitPosi); 28: } 29: } 30: else if(bitPosi == 0xFF){ 31: *(uint32_t *)p = value; 32: } 33: }

調(diào)用關(guān)系:

GPIO_SetLowLevel(LED_PORT, LED_PINS, ENABLE);????????????????? LedOn()??????????? main.c

?? |-CHECK_PARAM(PARAM_GPIOx(pGPIO));???????????????????????????????????

?? |-gpio_setvalue((uint32_t *)&pGPIO->CLR, bitPosi, value);??

(5)設(shè)置IOCON_PIOn_m的值

LED引腳的寄存器 在 E:\kpan\Desktop\LPC\LPC1200系列微控制器產(chǎn)品數(shù)據(jù)手冊(cè)(英) LPC1200_ds_en page112頁(yè).

6.4.48 PIO1_2 register

?

(6)LED初始化函數(shù)


void ledInit (void)
{
IOCON_PIO_CFG_Type PIO_mode;

IOCON_StructInit(&PIO_mode); /* 初始化端口模式 */
PIO_mode.type = GusGPIO1Port[LED_PINS];
IOCON_SetFunc(&PIO_mode); /* 設(shè)置LED引腳為GPIO功能 */

GPIO_SetDir(LED_PORT, LED_PINS, GPIO_DIR_OUTPUT); /* 設(shè)置LED引腳為輸出 */

ledOff(); /* 熄滅LED */
}


分析:

第一句,IOCON_PIO_CFG_Type PIO_mode;定義了一個(gè)IO引腳配置的結(jié)構(gòu)體,描述了上面的? 6.4.48 PIO1_2 register 的值.

typedef struct {
??? uint16_t??? type;???? /*!< low 8 bits is address offset, other is func >
???????????????????????????????????????????????? This parameter can be a value of @ref PIO_type */
??? uint8_t???? pinmode;? /*!<? Pin mode >
???????????????????????????????????????????????? This parameter can be a value of @ref PIO_pin_mode */
??? uint8_t???? invert;?? /*!<? Inverted function >
???????????????????????????????????????????????? This parameter can be a value of @ref Invert_input_mode */
??? uint8_t???? ad;?????? /*!<? analog/digital mode >
???????????????????????????????????????????????? This parameter can be a value of @ref Analog_digital_mode */
??? uint16_t??? pmode;??? /*!<? Push/pull mode for I2C >
???????????????????????????????????????????????? This parameter can be a value of @ref Push_Pull_mode */
??? uint16_t??? od;?????? /*!<? Open drive >
???????????????????????????????????????????????? This parameter can be a value of @ref Open_drain_mode */
??? uint16_t??? drive;??? /*!<? Pin driver function >
???????????????????????????????????????????????? This parameter can be a value of @ref Drive_current_mode */
??? uint16_t??? sm;?????? /*!<? Sample mode >
???????????????????????????????????????????????? This parameter can be a value of @ref Sample_mode */
??? uint32_t??? cd;?????? /*!<? Clock Divider >
???????????????????????????????????????????????? This parameter can be a value of @ref clock_divider_num */
} IOCON_PIO_CFG_Type;

第二句,IOCON_StructInit(&PIO_mode);? 使用默認(rèn)值來(lái)初始化了結(jié)構(gòu)體.

void IOCON_StructInit ( IOCON_PIO_CFG_Type *mode)
{
?? mode->type = 0x0;
?? mode->pinmode = IOCON_PIO_MODE_PULLUP;
?? mode->invert = IOCON_PIO_INV_NOT;
?? mode->pmode = IOCON_PIO_PMODE_DISABLE;
?? mode->od = IOCON_PIO_OD_DISABLE;
?? mode->drive = IOCON_PIO_DRV_2MA_12MA;
?? mode->ad = IOCON_PIO_AD_DIGITAL;
?? mode->sm = IOCON_PIO_SMODE_BYPASS;
?? mode->cd = IOCON_PIO_CLKDIV_0;
}

第三句,PIO_mode.type = GusGPIO1Port[LED_PINS];設(shè)置結(jié)構(gòu)體的type成員的值

PIO_mode.type = GusGPIO1Port[LED_PINS];

LED_PINS=2,那么根據(jù)定義的數(shù)組

static uint16_t GusGPIO1Port[7] = {???????????????????????????????????? /* GPIO1端口引腳類型??????????? */
??? IOCON_PIO_1_0,
??? IOCON_PIO_1_1,
??? IOCON_PIO_1_2,
??? IOCON_PIO_1_3,
??? IOCON_PIO_1_4,
??? IOCON_PIO_1_5,
??? IOCON_PIO_1_6
};

有PIO_mode.type =IOCON_PIO_1_2? ,

根據(jù)宏定義

#define IOCON_PIO_1_2 ((uint16_t)0x0C40 )

所以,最后有,IO引腳結(jié)構(gòu)體type成員變量為

PIO_mode.type=0x0C40

第四句,IOCON_SetFunc(&PIO_mode); /* 設(shè)置LED引腳為GPIO功能 */

根據(jù)結(jié)構(gòu)體指針來(lái)設(shè)置引腳的功能

?

void IOCON_SetFunc ( IOCON_PIO_CFG_Type *mode)
{
??? uint32_t offset;
??? uint32_t func;?
??? uint32_t tmp;
??? uint32_t *p = (uint32_t *)&LPC_IOCON->PIO2_28;

??? CHECK_PARAM( PARAM_IOCON_PIO_TYPE(mode->type) );
??? CHECK_PARAM( PARAM_IOCON_PIO_MODE(mode->pinmode));
??? CHECK_PARAM( PARAM_IOCON_PIO_DRV(mode->drive) );
??? CHECK_PARAM( PARAM_IOCON_PIO_AD(mode->ad) );
??? CHECK_PARAM( PARAM_IOCON_PIO_OD(mode->od));??
??? CHECK_PARAM( PARAM_IOCON_PIO_INV(mode->invert) );
??? CHECK_PARAM( PARAM_IOCON_PIO_SMODE(mode->sm));
??? CHECK_PARAM( PARAM_IOCON_PIO_CLKDIV(mode->cd));

??? offset = (mode->type >> 6);
??? func = (mode->type & 0xf);

??? if(offset == 0x24 || offset == 0x25){ //0x90, 0x94 right shift 2 bit
?????? tmp = (uint32_t)(func|(mode->pmode)|(mode->od)|(mode->invert)|(mode->sm)|(mode->cd));

??? }else{
?????? tmp = (uint32_t)(func|(mode->pinmode)|(mode->drive)|(mode->ad)|(mode->od)|(mode->invert)|(mode->sm)|(mode->cd));
??? }
??? *(uint32_t *)(p + offset) = tmp;
}

第五句,GPIO_SetDir(LED_PORT, LED_PINS, GPIO_DIR_OUTPUT);???? 設(shè)置端口方向,輸出

/**
? * @brief?????? Set Direction for GPIO port.
? * @param pGPIO??? Port Number selection, should be LPC_GPIO0, LPC_GPIO1, LPC_GPIO2
? * @param bitPosi?????? bit position value, should be from 0 to 31, if it is oxff, set 'value'
? * @param value??????? if bitPosi is from 0 to 31, Direction value, should be:
? *???????????????????????????? - 0: Input.
? *???????????????????????????? - 1: Output.
? *???????????????????????????? if bitPosi is oxff, set the all 32-bits of register
? * @return????? None
? *
? * Note: All remaining bits that are not activated in bitValue (value '0')
? * will not be effected by this function.
? */
void GPIO_SetDir(LPC_GPIO_TypeDef* pGPIO, uint8_t bitPosi, uint32_t value)
{
??? CHECK_PARAM(PARAM_GPIOx(pGPIO));

??? gpio_setvalue((uint32_t *)&pGPIO->DIR, bitPosi, value);??????
?
}

第六句,LedOff(),燈滅.

2013年3月30日 17:13:44


轉(zhuǎn)載于:https://www.cnblogs.com/xilifeng/archive/2013/03/30/2989914.html

總結(jié)

以上是生活随笔為你收集整理的TKStudio-LPC1220_GPIO_LED工程后记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美一级大片 | 免费av网站在线观看 | av导航网址 | 波多野结衣视频一区二区 | 久热这里只有 | 欧美性猛交bbbbb精品 | jizz日本大全 | 大肉大捧一进一出好爽视频动漫 | 国产精品videossex久久发布 | 第一福利丝瓜av导航 | 日韩欧美视频在线播放 | 婷婷色av | 国产在线免费av | 在线观看sm | 久久精品999 | 欧美韩日国产 | 岳奶大又白下面又肥又黑水多 | 成年人免费在线观看视频网站 | 国产精品免费看久久久无码 | 国产成人中文字幕 | 日韩中文字幕高清 | 91中文字幕在线播放 | 国产v片在线观看 | 91调教视频 | 成年人黄色 | 四虎国产精品免费 | 国产特黄大片aaaa毛片 | 日本不卡在线 | 欧美精品一二三 | 欧美综合在线一区 | 亚洲欧美日韩中文字幕在线观看 | 国产尤物av | 黄色片网站免费观看 | 亚洲一区二区三区色 | 国产思思99re99在线观看 | 国产精品久久久网站 | 国产欧美精品一区二区色综合朱莉 | 极品五月天 | 小罗莉极品一线天在线 | 日日操日日 | 狼色网| 国产乱淫精品一区二区三区毛片 | 中文字幕女优 | 中文字幕av影视 | 久久97精品 | 农村妇女av | 中文字幕一区二区三区精华液 | 中文字幕欧美在线观看 | 男女做爰猛烈高潮描写 | 日p免费视频 | 国产精品国产三级国产三级人妇 | 欧美日韩在线不卡 | 欧美少妇视频 | 国产视频www | 自拍 亚洲 欧美 | 色呦呦在线视频 | 少妇高潮av久久久久久 | 秘密基地免费观看完整版中文 | 日韩视频在线观看一区二区三区 | 国产一区二区不卡在线 | 国产一级免费视频 | 日本免费网址 | 日韩一区二区三区在线视频 | 91精品国产高清一区二区三蜜臀 | 亚洲av电影一区 | 日韩精品卡通动漫网站 | 明日花绮罗高潮无打码 | 美女野外找人搭讪啪啪 | 亚洲av综合永久无码精品天堂 | 九九热精品 | 久久视频一区 | 日日操影院 | 国产av成人一区二区三区 | 打开免费观看视频在线 | 久久超级碰碰 | 久久精品国产亚洲av高清色欲 | 成人免费视频一区二区三区 | 香蕉视频国产在线观看 | 欧美999 | 一级视频免费观看 | 国产色悠悠 | 看一级黄色| 恶虐女帝安卓汉化版最新版本 | 在线观看日韩欧美 | 欧美拍拍 | 国产熟女高潮视频 | 亚洲a免费| 免费看污片网站 | 欧美日韩亚洲高清 | 91三级视频 | 久久a视频 | 国产精品午夜一区二区 | 久久丝袜视频 | 三级av在线播放 | 99ri国产| 国产精品一区二区三区在线播放 | 中国女人一级一次看片 | 91美女诱惑 | 久久影视av |