LM3S用C語言編寫驅動有兩種方式
一,直接操作寄存器
二,使用官方提供的API函數
一般編程時需要考慮的東西
1,引入哪些標頭檔,儲存空間選擇是否正確,時鐘設定,
2,是不是需要中斷,中斷配置
3,模組是否需要使能
4,具體的相關配置
5,正確的使用
以下就兩種方式進行詳述
一,直接操作寄存器
引入標頭檔
1,閱讀資料手冊,查看涉及到的片上資源如何使用--比如使能GPIO
2,配置相關的寄存器--類比數字,輸入輸出,是否上拉等
3,IO資料寫入 讀取
//*****************************************************************************
#include "inc/lm3s9b92.h"
int main(void)
{
volatile unsigned long ulLoop;
SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF;
ulLoop = SYSCTL_RCGC2_R;
GPIO_PORTF_DIR_R = 0x0C;
GPIO_PORTF_DEN_R = 0x0C;
while(1)
{
GPIO_PORTF_DATA_R |= 0x0C;
for(ulLoop = 0; ulLoop < 200000; ulLoop++)
{
}
GPIO_PORTF_DATA_R &= ~(0x0C);
for(ulLoop = 0; ulLoop < 200000; ulLoop++)
{
}
}
}
二,使用官方提供的API函數
文本
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_ints.h>
#include <interrupt.h>
#include <sysctl.h>
#include <gpio.h>
//*****************************************************************************
//通過 key觸發相應管腳中斷
//進入中斷後,翻轉 LED電平
//
//*****************************************************************************
int main(void)
{
//// 時鐘初始化:晶振,6MHz
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ);
//使用者 LED燈所對應的管腳為 PC5
// 使能 LED所在的 GPIO連接埠
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
// 設定 LED所在管腳為輸出
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
// 使能 KEY所在的 GPIO連接埠
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);
// 設定 KEY所在管腳為輸入
GPIOIntTypeSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_LOW_LEVEL);
// 設定 KEY管腳的中斷類型
GPIOPinIntEnable(GPIO_PORTC_BASE, GPIO_PIN_4);
// 使能 KEY所在管腳的中斷
IntEnable(INT_GPIOC);
// 使能 GPIOD連接埠中斷
IntMasterEnable();
// 使能處理器中斷
for(; ; )
{ }
}
// GPIOD的中斷服務函數
void GPIO_Port_C_ISR(void)
{
unsigned char ucVal;
unsigned long ulStatus;
ulStatus = GPIOPinIntStatus(GPIO_PORTC_BASE, true); // 讀取中斷狀態
GPIOPinIntClear(GPIO_PORTC_BASE, ulStatus); // 清除中斷狀態,重要
if (ulStatus & GPIO_PIN_4) // 如果 KEY 的中斷狀態有效
{
ucVal = GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_5); / / 翻轉 LED
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5, ~ucVal);
SysCtlDelay(300000);
// 延時約 10ms,消除按鍵抖動
while (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0x00);
// 等待 KEY抬起
SysCtlDelay(300000);
// 延時約 10ms,消除松鍵抖動
}
}