由于我参加了自控方向的电赛,而我们省的电赛又是由Ti公司赞助的,所以在比赛是使用Ti公司的单片机会有得分加成,这就使得我需要重新再学习一种新的单片机,虽然刚开始的时候内心是拒绝的,但是后来当接触到了Ti之后,发现这个公司的IDE以及库函数比我原来开发stm32的那一套工具好用多了,于是也渐渐开始能接受学习tm4这块板子了。
在寒假期间,我把tm4的基础使用学习的差不多了,同时也自己构建了一些以我自己的代码风格为标准的tm4驱动库,这篇博文的主要目的也就是分享一下我自己写的这些库函数。排序比较随意,将就着看看吧……
代码使用的开发板型号:TM4C123GTX
单片机型号:TM4C123GH6PM
特别提示:由于不同种类的开发板及芯片型号的区别,请在移植时确保读懂代码,并确认代码与自己的库函数的兼容性,并根据需要修改端口配置等。如果不兼容的话,可能需要使用自己版本的库函数替换代码中的库函数,这一块请自行配置吧,应该不会太难的~
此外,有部分中断初测采用的是在中断向量表中注册的方式,所以并没有动态注册的代码,还请留意。
1.ADS模块
ADS模块,即数模转换模块,这个模块可以把电压信号转换为PWM波来供单片机读取,这个模块通常会与其他传感器连接,用于获取传感器的数值。我提供的这个ADS驱动库包含了单通道电压的读取。
//ads.h #ifndef ADS_H #define ADS_H #define VOLTAGE_RESOLUTION 0.125 /* 满量程2.048V */ #define VOLTAGE_U0 3300.0 /* mV */ void ADS_Init(); void Get_ADS_Value(); #endif
//ads.c #include "ads.h" #include <stdint.h> #include <stdbool.h> #include "inc/hw_memmap.h" #include "inc/hw_gpio.h" #include "inc/hw_timer.h" #include "inc/hw_types.h" #include "inc/hw_ssi.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/ssi.h" #include "driverlib/fpu.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" #include "sys_driver/ADS118/ads1118.h" #include "libraries/delay/delay.h" // ads寄存器输出值 uint16_t ads_outcode; // ads1118测得电压值 单位 uV double ads_voltage; uint16_t ads_voltage_mv; float fVoltage0 = 0, fVoltage1 = 0; void ADS_Init() { ADS1118_Init(); } void Get_ADS_Value() { ADS1118_Configure(ADS1118_CONFIG_0); delay_ms(10); ADS1118_DataGetFloat(&fVoltage0); ADS1118_Configure(ADS1118_CONFIG_1); delay_ms(10); ADS1118_DataGetFloat(&fVoltage1); }
2.延时函数
制作延时函数的库其实很简单,甚至严格地说没有必要,甚至可以说有点浪费资源,但是因为我看不惯原本的延时函数那么复杂的一串代码,所以我还是把那个代码简化了一下。
//delay.h #ifndef DELAY_H #define DELAY_H void delay_ms(int ms);//延时函数(以毫秒为单位) #endif
//delay.c # include "delay.h" #include <stdint.h> #include <stdbool.h> #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "inc/hw_ints.h" #include "inc/hw_timer.h" #include "driverlib/rom.h" #include "driverlib/gpio.h" #include "driverlib/pwm.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/timer.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" #include "driverlib/rom_map.h" void delay_ms(int ms) { SysCtlDelay(SysCtlClockGet()/3000*ms); }
然后后来发现延时函数也可以采用宏定义的方式进行简化,这样的话其对资源的消耗就几乎没有了。
#define delay_ms(x) SysCtlDelay(SysCtlClockGet()/3000*x)
3.GPIO中断
这一块是GPIO输入中断的库函数,中断一直都是单片机里面非常实用的一个功能,这一块配置了A7端口的上升沿中断,并通过中断处理计算间隔时间。
//gpio_int.h # ifndef GPIO_INT_H # define GPIO_INT_H void GPIO_Int_Init();//初始化I/O中断 void IntHandlerGPIOA();//I/O口中断处理函数 #endif
//gpio_int.c #include "gpio_int.h" #include <stdint.h> #include <stdbool.h> #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "inc/hw_ints.h" #include "inc/hw_timer.h" #include "driverlib/rom.h" #include "driverlib/gpio.h" #include "driverlib/pwm.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/timer.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" #include "driverlib/rom_map.h" bool bFinishFlag = false; unsigned int gpio_Frequency=0; void GPIO_Int_Init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA)); GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_7); GPIOIntEnable(GPIO_PORTA_BASE, GPIO_PIN_7); GPIOIntTypeSet(GPIO_PORTA_BASE, GPIO_PIN_7, GPIO_RISING_EDGE); GPIOIntRegister(GPIO_PORTA_BASE, IntHandlerGPIOA); IntEnable(INT_GPIOA); IntMasterEnable(); } void IntHandlerGPIOA() { uint32_t ui32IntStatus; static uint32_t ui32Time[2] = {0}; static uint8_t ui8EdgeCount = 0; double fPeriod = 0; ui32IntStatus = GPIOIntStatus(GPIO_PORTA_BASE, true); GPIOIntClear(GPIO_PORTA_BASE, ui32IntStatus); if((ui32IntStatus & GPIO_PIN_7) == GPIO_PIN_7) { ui32Time[ui8EdgeCount++] = TimerValueGet(TIMER0_BASE, TIMER_A); if(ui8EdgeCount > 1) { ui8EdgeCount = 0; fPeriod = ui32Time[1] > ui32Time[0] ? ui32Time[1] - ui32Time[0]: ui32Time[1] - ui32Time[0] + 0xFFFFFFFF; gpio_Frequency = 80000000.0/fPeriod; bFinishFlag = true; } } }
4.按键
这里的库函数使用的按键是开发板上自带的两个按键,并且写了两种配置方式:普通输入和按键中断。其实本质上说按键中断也算是GPIO中断。这里通过中断实现了获取按下按键的键值的功能。
//key.h #ifndef KEY_H #define KEY_H void key_Init();//按键1和2初始化 void key_Int_Init();//按键1中断初始化 void IntHandler_GPIOF();//按键1中断处理函数(需要在key.c中修改功能) #define SW_1 (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4)&GPIO_PIN_4)?0:1//检测按键1是否按下,1为按下,0为没有按下 #define SW_2 (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_0)&GPIO_PIN_0)?0:1//检测按键2是否按下,1为按下,0为没有按下 #endif
//key.c #include "key.h" #include <stdint.h> #include <stdbool.h> #include "inc/hw_memmap.h" #include "inc/hw_ints.h" #include "inc/hw_gpio.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/rom_map.h" #include "driverlib\sysctl.h" #include "libraries\delay\delay.h" #include "libraries\LED\led.h" #include "libraries\KEY\key.h" #include "driverlib/interrupt.h" #include "inc/hw_types.h" int key_flag=0; void key_Init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)); GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4); GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x1; GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_0); GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); } void key_Int_Init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)); HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x1; GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4 | GPIO_PIN_0); GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4 | GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); GPIOIntEnable(GPIO_PORTF_BASE, GPIO_PIN_4 | GPIO_PIN_0); GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_4 | GPIO_PIN_0, GPIO_FALLING_EDGE); IntPrioritySet (INT_GPIOF, 0xE1); GPIOIntRegister(GPIO_PORTF_BASE, IntHandler_GPIOF); IntEnable(INT_GPIOF); IntMasterEnable(); } void IntHandler_GPIOF() { GPIOIntClear(GPIO_PORTF_BASE, GPIOIntStatus(GPIO_PORTF_BASE, true)); if(SW_1)key_flag|=1; if(SW_2)key_flag|=2; }
5.LED
我这块开发板上的三色LED也可以说是一个不错的功能了,通过三色组合可以创造出很多不同的颜色,这里的库函数提供了普通的点灯功能以及通过pwm初始化形成不同颜色的灯光的功能,并且写了一个RGB函数来快速改变颜色。同时我在宏定义中抄了一张标准的RGB色表,预定义了很多颜色(当然因为是发光所以颜色并不准),可以尝试一下使用。
//led.h #ifndef LED_H #define LED_H #define MAX_DUTY 10000 void LED_Init();//三色LED灯初始化 void RGB_Init();//RGB输出模式初始化 void RGB(double red,double green,double blue);//设置输出颜色 #define RED_1 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1)//红灯亮 #define BLUE_1 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2)//蓝灯亮 #define GREEN_1 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3)//绿灯亮 #define RED_0 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0)//红灯灭 #define BLUE_0 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0)//蓝灯灭 #define GREEN_0 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0)//绿灯灭 #define RED_Status ((GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_1)&GPIO_PIN_1) == GPIO_PIN_1)?1:0//获取红灯是否开启 #define BLUE_Status ((GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_2)&GPIO_PIN_2) == GPIO_PIN_2)?1:0//获取蓝灯是否开启 #define GREEN_Status ((GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_3)&GPIO_PIN_3) == GPIO_PIN_3)?1:0//获取绿灯是否开启 //预定义颜色 //参考网址:http://www.wahart.com.hk/rgb.htm #define Snow RGB(255,250,250) #define GhostWhite RGB(248,248,255) #define WhiteSmoke RGB(245,245,245) #define Gainsboro RGB(220,220,220) #define FloralWhite RGB(255,250,240) #define OldLace RGB(253,245,230) #define Linen RGB(250,240,230) #define AntiqueWhite RGB(250,235,215) #define PapayaWhip RGB(255,239,213) #define BlanchedAlmond RGB(255,235,205) #define Bisque RGB(255,228,196) #define PeachPuff RGB(255,218,185) #define NavajoWhite RGB(255,222,173) #define Moccasin RGB(255,228,181) #define Cornsilk RGB(255,248,220) #define Ivory RGB(255,255,240) #define LemonChiffon RGB(255,250,205) #define Seashell RGB(255,245,238) #define Honeydew RGB(240,255,240) #define MintCream RGB(245,255,250) #define Azure RGB(240,255,255) #define AliceBlue RGB(240,248,255) #define lavender RGB(230,230,250) #define LavenderBlush RGB(255,240,245) #define MistyRose RGB(255,228,225) #define White RGB(255,255,255) #define Black RGB( 0, 0, 0) #define DarkSlateGray RGB( 47, 79, 79) #define DimGrey RGB(105,105,105) #define SlateGrey RGB(112,128,144) #define LightSlateGray RGB(119,136,153) #define Grey RGB(190,190,190) #define LightGray RGB(211,211,211) #define MidnightBlue RGB( 25, 25,112) #define NavyBlue RGB( 0, 0,128) #define CornflowerBlue RGB(100,149,237) #define DarkSlateBlue RGB( 72, 61,139) #define SlateBlue RGB(106, 90,205) #define MediumSlateBlue RGB(123,104,238) #define LightSlateBlue RGB(132,112,255) #define MediumBlue RGB( 0, 0,205) #define RoyalBlue RGB( 65,105,225) #define Blue RGB( 0, 0,255) #define DodgerBlue RGB( 30,144,255) #define DeepSkyBlue RGB( 0,191,255) #define SkyBlue RGB(135,206,235) #define LightSkyBlue RGB(135,206,250) #define SteelBlue RGB( 70,130,180) #define LightSteelBlue RGB(176,196,222) #define LightBlue RGB(173,216,230) #define PowderBlue RGB(176,224,230) #define PaleTurquoise RGB(175,238,238) #define DarkTurquoise RGB( 0,206,209) #define MediumTurquoise RGB( 72,209,204) #define Turquoise RGB( 64,224,208) #define Cyan RGB( 0,255,255) #define LightCyan RGB(224,255,255) #define CadetBlue RGB( 95,158,160) #define MediumAquamarine RGB(102,205,170) #define Aquamarine RGB(127,255,212) #define DarkGreen RGB( 0,100, 0) #define DarkOliveGreen RGB( 85,107, 47) #define DarkSeaGreen RGB(143,188,143) #define SeaGreen RGB( 46,139, 87) #define MediumSeaGreen RGB( 60,179,113) #define LightSeaGreen RGB( 32,178,170) #define PaleGreen RGB(152,251,152) #define SpringGreen RGB( 0,255,127) #define LawnGreen RGB(124,252, 0) #define Green RGB( 0,255, 0) #define Chartreuse RGB(127,255, 0) #define MedSpringGreen RGB( 0,250,154) #define GreenYellow RGB(173,255, 47) #define LimeGreen RGB( 50,205, 50) #define YellowGreen RGB(154,205, 50) #define ForestGreen RGB( 34,139, 34) #define OliveDrab RGB(107,142, 35) #define DarkKhaki RGB(189,183,107) #define PaleGoldenrod RGB(238,232,170) #define LtGoldenrodYello RGB(250,250,210) #define LightYellow RGB(255,255,224) #define Yellow RGB(255,255, 0) #define Gold RGB(255,215, 0) #define LightGoldenrod RGB(238,221,130) #define goldenrod RGB(218,165, 32) #define DarkGoldenrod RGB(184,134, 11) #define RosyBrown RGB(188,143,143) #define IndianRed RGB(205, 92, 92) #define SaddleBrown RGB(139, 69, 19) #define Sienna RGB(160, 82, 45) #define Peru RGB(205,133, 63) #define Burlywood RGB(222,184,135) #define Beige RGB(245,245,220) #define Wheat RGB(245,222,179) #define SandyBrown RGB(244,164, 96) #define Tan RGB(210,180,140) #define Chocolate RGB(210,105, 30) #define Firebrick RGB(178, 34, 34) #define Brown RGB(165, 42, 42) #define DarkSalmon RGB(233,150,122) #define Salmon RGB(250,128,114) #define LightSalmon RGB(255,160,122) #define Orange RGB(255,165, 0) #define DarkOrange RGB(255,140, 0) #define Coral RGB(255,127, 80) #define LightCoral RGB(240,128,128) #define Tomato RGB(255, 99, 71) #define OrangeRed RGB(255, 69, 0) #define Red RGB(255, 0, 0) #define HotPink RGB(255,105,180) #define DeepPink RGB(255, 20,147) #define Pink RGB(255,192,203) #define LightPink RGB(255,182,193) #define PaleVioletRed RGB(219,112,147) #define Maroon RGB(176, 48, 96) #define MediumVioletRed RGB(199, 21,133) #define VioletRed RGB(208, 32,144) #define Magenta RGB(255, 0,255) #define Violet RGB(238,130,238) #define Plum RGB(221,160,221) #define Orchid RGB(218,112,214) #define MediumOrchid RGB(186, 85,211) #define DarkOrchid RGB(153, 50,204) #define DarkViolet RGB(148, 0,211) #define BlueViolet RGB(138, 43,226) #define Purple RGB(160, 32,240) #define MediumPurple RGB(147,112,219) #define Thistle RGB(216,191,216) #define Snow1 RGB(255,250,250) #define Snow2 RGB(238,233,233) #define Snow3 RGB(205,201,201) #define Snow4 RGB(139,137,137) #define Seashell1 RGB(255,245,238) #define Seashell2 RGB(238,229,222) #define Seashell3 RGB(205,197,191) #define Seashell4 RGB(139,134,130) #define AntiqueWhite1 RGB(255,239,219) #define AntiqueWhite2 RGB(238,223,204) #define AntiqueWhite3 RGB(205,192,176) #define AntiqueWhite4 RGB(139,131,120) #define Bisque1 RGB(255,228,196) #define Bisque2 RGB(238,213,183) #define Bisque3 RGB(205,183,158) #define Bisque4 RGB(139,125,107) #define PeachPuff1 RGB(255,218,185) #define PeachPuff2 RGB(238,203,173) #define PeachPuff3 RGB(205,175,149) #define PeachPuff4 RGB(139,119,101) #define NavajoWhite1 RGB(255,222,173) #define NavajoWhite2 RGB(238,207,161) #define NavajoWhite3 RGB(205,179,139) #define NavajoWhite4 RGB(139,121, 94) #define LemonChiffon1 RGB(255,250,205) #define LemonChiffon2 RGB(238,233,191) #define LemonChiffon3 RGB(205,201,165) #define LemonChiffon4 RGB(139,137,112) #define Cornsilk1 RGB(255,248,220) #define Cornsilk2 RGB(238,232,205) #define Cornsilk3 RGB(205,200,177) #define Cornsilk4 RGB(139,136,120) #define Ivory1 RGB(255,255,240) #define Ivory2 RGB(238,238,224) #define Ivory3 RGB(205,205,193) #define Ivory4 RGB(139,139,131) #define Honeydew1 RGB(240,255,240) #define Honeydew2 RGB(224,238,224) #define Honeydew3 RGB(193,205,193) #define Honeydew4 RGB(131,139,131) #define LavenderBlush1 RGB(255,240,245) #define LavenderBlush2 RGB(238,224,229) #define LavenderBlush3 RGB(205,193,197) #define LavenderBlush4 RGB(139,131,134) #define MistyRose1 RGB(255,228,225) #define MistyRose2 RGB(238,213,210) #define MistyRose3 RGB(205,183,181) #define MistyRose4 RGB(139,125,123) #define Azure1 RGB(240,255,255) #define Azure2 RGB(224,238,238) #define Azure3 RGB(193,205,205) #define Azure4 RGB(131,139,139) #define SlateBlue1 RGB(131,111,255) #define SlateBlue2 RGB(122,103,238) #define SlateBlue3 RGB(105, 89,205) #define SlateBlue4 RGB( 71, 60,139) #define RoyalBlue1 RGB( 72,118,255) #define RoyalBlue2 RGB( 67,110,238) #define RoyalBlue3 RGB( 58, 95,205) #define RoyalBlue4 RGB( 39, 64,139) #define Blue1 RGB( 0, 0,255) #define Blue2 RGB( 0, 0,238) #define Blue3 RGB( 0, 0,205) #define Blue4 RGB( 0, 0,139) #define DodgerBlue1 RGB( 30,144,255) #define DodgerBlue2 RGB( 28,134,238) #define DodgerBlue3 RGB( 24,116,205) #define DodgerBlue4 RGB( 16, 78,139) #define SteelBlue1 RGB( 99,184,255) #define SteelBlue2 RGB( 92,172,238) #define SteelBlue3 RGB( 79,148,205) #define SteelBlue4 RGB( 54,100,139) #define DeepSkyBlue1 RGB( 0,191,255) #define DeepSkyBlue2 RGB( 0,178,238) #define DeepSkyBlue3 RGB( 0,154,205) #define DeepSkyBlue4 RGB( 0,104,139) #define SkyBlue1 RGB(135,206,255) #define SkyBlue2 RGB(126,192,238) #define SkyBlue3 RGB(108,166,205) #define SkyBlue4 RGB( 74,112,139) #define LightSkyBlue1 RGB(176,226,255) #define LightSkyBlue2 RGB(164,211,238) #define LightSkyBlue3 RGB(141,182,205) #define LightSkyBlue4 RGB( 96,123,139) #define SlateGray1 RGB(198,226,255) #define SlateGray2 RGB(185,211,238) #define SlateGray3 RGB(159,182,205) #define SlateGray4 RGB(108,123,139) #define LightSteelBlue1 RGB(202,225,255) #define LightSteelBlue2 RGB(188,210,238) #define LightSteelBlue3 RGB(162,181,205) #define LightSteelBlue4 RGB(110,123,139) #define LightBlue1 RGB(191,239,255) #define LightBlue2 RGB(178,223,238) #define LightBlue3 RGB(154,192,205) #define LightBlue4 RGB(104,131,139) #define LightCyan1 RGB(224,255,255) #define LightCyan2 RGB(209,238,238) #define LightCyan3 RGB(180,205,205) #define LightCyan4 RGB(122,139,139) #define PaleTurquoise1 RGB(187,255,255) #define PaleTurquoise2 RGB(174,238,238) #define PaleTurquoise3 RGB(150,205,205) #define PaleTurquoise4 RGB(102,139,139) #define CadetBlue1 RGB(152,245,255) #define CadetBlue2 RGB(142,229,238) #define CadetBlue3 RGB(122,197,205) #define CadetBlue4 RGB( 83,134,139) #define Turquoise1 RGB( 0,245,255) #define Turquoise2 RGB( 0,229,238) #define Turquoise3 RGB( 0,197,205) #define Turquoise4 RGB( 0,134,139) #define Cyan1 RGB( 0,255,255) #define Cyan2 RGB( 0,238,238) #define Cyan3 RGB( 0,205,205) #define Cyan4 RGB( 0,139,139) #define DarkSlateGray1 RGB(151,255,255) #define DarkSlateGray2 RGB(141,238,238) #define DarkSlateGray3 RGB(121,205,205) #define DarkSlateGray4 RGB( 82,139,139) #define Aquamarine1 RGB(127,255,212) #define Aquamarine2 RGB(118,238,198) #define Aquamarine3 RGB(102,205,170) #define Aquamarine4 RGB( 69,139,116) #define DarkSeaGreen1 RGB(193,255,193) #define DarkSeaGreen2 RGB(180,238,180) #define DarkSeaGreen3 RGB(155,205,155) #define DarkSeaGreen4 RGB(105,139,105) #define SeaGreen1 RGB( 84,255,159) #define SeaGreen2 RGB( 78,238,148) #define SeaGreen3 RGB( 67,205,128) #define SeaGreen4 RGB( 46,139, 87) #define PaleGreen1 RGB(154,255,154) #define PaleGreen2 RGB(144,238,144) #define PaleGreen3 RGB(124,205,124) #define PaleGreen4 RGB( 84,139, 84) #define SpringGreen1 RGB( 0,255,127) #define SpringGreen2 RGB( 0,238,118) #define SpringGreen3 RGB( 0,205,102) #define SpringGreen4 RGB( 0,139, 69) #define Green1 RGB( 0,255, 0) #define Green2 RGB( 0,238, 0) #define Green3 RGB( 0,205, 0) #define Green4 RGB( 0,139, 0) #define Chartreuse1 RGB(127,255, 0) #define Chartreuse2 RGB(118,238, 0) #define Chartreuse3 RGB(102,205, 0) #define Chartreuse4 RGB( 69,139, 0) #define OliveDrab1 RGB(192,255, 62) #define OliveDrab2 RGB(179,238, 58) #define OliveDrab3 RGB(154,205, 50) #define OliveDrab4 RGB(105,139, 34) #define DarkOliveGreen1 RGB(202,255,112) #define DarkOliveGreen2 RGB(188,238,104) #define DarkOliveGreen3 RGB(162,205, 90) #define DarkOliveGreen4 RGB(110,139, 61) #define Khaki1 RGB(255,246,143) #define Khaki2 RGB(238,230,133) #define Khaki3 RGB(205,198,115) #define Khaki4 RGB(139,134, 78) #define LightGoldenrod1 RGB(255,236,139) #define LightGoldenrod2 RGB(238,220,130) #define LightGoldenrod3 RGB(205,190,112) #define LightGoldenrod4 RGB(139,129, 76) #define LightYellow1 RGB(255,255,224) #define LightYellow2 RGB(238,238,209) #define LightYellow3 RGB(205,205,180) #define LightYellow4 RGB(139,139,122) #define Yellow1 RGB(255,255, 0) #define Yellow2 RGB(238,238, 0) #define Yellow3 RGB(205,205, 0) #define Yellow4 RGB(139,139, 0) #define Gold1 RGB(255,215, 0) #define Gold2 RGB(238,201, 0) #define Gold3 RGB(205,173, 0) #define Gold4 RGB(139,117, 0) #define Goldenrod1 RGB(255,193, 37) #define Goldenrod2 RGB(238,180, 34) #define Goldenrod3 RGB(205,155, 29) #define Goldenrod4 RGB(139,105, 20) #define DarkGoldenrod1 RGB(255,185, 15) #define DarkGoldenrod2 RGB(238,173, 14) #define DarkGoldenrod3 RGB(205,149, 12) #define DarkGoldenrod4 RGB(139,101, 8) #define RosyBrown1 RGB(255,193,193) #define RosyBrown2 RGB(238,180,180) #define RosyBrown3 RGB(205,155,155) #define RosyBrown4 RGB(139,105,105) #define IndianRed1 RGB(255,106,106) #define IndianRed2 RGB(238, 99, 99) #define IndianRed3 RGB(205, 85, 85) #define IndianRed4 RGB(139, 58, 58) #define Sienna1 RGB(255,130, 71) #define Sienna2 RGB(238,121, 66) #define Sienna3 RGB(205,104, 57) #define Sienna4 RGB(139, 71, 38) #define Burlywood1 RGB(255,211,155) #define Burlywood2 RGB(238,197,145) #define Burlywood3 RGB(205,170,125) #define Burlywood4 RGB(139,115, 85) #define Wheat1 RGB(255,231,186) #define Wheat2 RGB(238,216,174) #define Wheat3 RGB(205,186,150) #define Wheat4 RGB(139,126,102) #define Tan1 RGB(255,165, 79) #define Tan2 RGB(238,154, 73) #define Tan3 RGB(205,133, 63) #define Tan4 RGB(139, 90, 43) #define Chocolate1 RGB(255,127, 36) #define Chocolate2 RGB(238,118, 33) #define Chocolate3 RGB(205,102, 29) #define Chocolate4 RGB(139, 69, 19) #define Firebrick1 RGB(255, 48, 48) #define Firebrick2 RGB(238, 44, 44) #define Firebrick3 RGB(205, 38, 38) #define Firebrick4 RGB(139, 26, 26) #define Brown1 RGB(255, 64, 64) #define Brown2 RGB(238, 59, 59) #define Brown3 RGB(205, 51, 51) #define Brown4 RGB(139, 35, 35) #define Salmon1 RGB(255,140,105) #define Salmon2 RGB(238,130, 98) #define Salmon3 RGB(205,112, 84) #define Salmon4 RGB(139, 76, 57) #define LightSalmon1 RGB(255,160,122) #define LightSalmon2 RGB(238,149,114) #define LightSalmon3 RGB(205,129, 98) #define LightSalmon4 RGB(139, 87, 66) #define Orange1 RGB(255,165, 0) #define Orange2 RGB(238,154, 0) #define Orange3 RGB(205,133, 0) #define Orange4 RGB(139, 90, 0) #define DarkOrange1 RGB(255,127, 0) #define DarkOrange2 RGB(238,118, 0) #define DarkOrange3 RGB(205,102, 0) #define DarkOrange4 RGB(139, 69, 0) #define Coral1 RGB(255,114, 86) #define Coral2 RGB(238,106, 80) #define Coral3 RGB(205, 91, 69) #define Coral4 RGB(139, 62, 47) #define Tomato1 RGB(255, 99, 71) #define Tomato2 RGB(238, 92, 66) #define Tomato3 RGB(205, 79, 57) #define Tomato4 RGB(139, 54, 38) #define OrangeRed1 RGB(255, 69, 0) #define OrangeRed2 RGB(238, 64, 0) #define OrangeRed3 RGB(205, 55, 0) #define OrangeRed4 RGB(139, 37, 0) #define Red1 RGB(255, 0, 0) #define Red2 RGB(238, 0, 0) #define Red3 RGB(205, 0, 0) #define Red4 RGB(139, 0, 0) #define DeepPink1 RGB(255, 20,147) #define DeepPink2 RGB(238, 18,137) #define DeepPink3 RGB(205, 16,118) #define DeepPink4 RGB(139, 10, 80) #define HotPink1 RGB(255,110,180) #define HotPink2 RGB(238,106,167) #define HotPink3 RGB(205, 96,144) #define HotPink4 RGB(139, 58, 98) #define Pink1 RGB(255,181,197) #define Pink2 RGB(238,169,184) #define Pink3 RGB(205,145,158) #define Pink4 RGB(139, 99,108) #define LightPink1 RGB(255,174,185) #define LightPink2 RGB(238,162,173) #define LightPink3 RGB(205,140,149) #define LightPink4 RGB(139, 95,101) #define PaleVioletRed1 RGB(255,130,171) #define PaleVioletRed2 RGB(238,121,159) #define PaleVioletRed3 RGB(205,104,137) #define PaleVioletRed4 RGB(139, 71, 93) #define Maroon1 RGB(255, 52,179) #define Maroon2 RGB(238, 48,167) #define Maroon3 RGB(205, 41,144) #define Maroon4 RGB(139, 28, 98) #define VioletRed1 RGB(255, 62,150) #define VioletRed2 RGB(238, 58,140) #define VioletRed3 RGB(205, 50,120) #define VioletRed4 RGB(139, 34, 82) #define Magenta1 RGB(255, 0,255) #define Magenta2 RGB(238, 0,238) #define Magenta3 RGB(205, 0,205) #define Magenta4 RGB(139, 0,139) #define Orchid1 RGB(255,131,250) #define Orchid2 RGB(238,122,233) #define Orchid3 RGB(205,105,201) #define Orchid4 RGB(139, 71,137) #define Plum1 RGB(255,187,255) #define Plum2 RGB(238,174,238) #define Plum3 RGB(205,150,205) #define Plum4 RGB(139,102,139) #define MediumOrchid1 RGB(224,102,255) #define MediumOrchid2 RGB(209, 95,238) #define MediumOrchid3 RGB(180, 82,205) #define MediumOrchid4 RGB(122, 55,139) #define DarkOrchid1 RGB(191, 62,255) #define DarkOrchid2 RGB(178, 58,238) #define DarkOrchid3 RGB(154, 50,205) #define DarkOrchid4 RGB(104, 34,139) #define Purple1 RGB(155, 48,255) #define Purple2 RGB(145, 44,238) #define Purple3 RGB(125, 38,205) #define Purple4 RGB( 85, 26,139) #define MediumPurple1 RGB(171,130,255) #define MediumPurple2 RGB(159,121,238) #define MediumPurple3 RGB(137,104,205) #define MediumPurple4 RGB( 93, 71,139) #define Thistle1 RGB(255,225,255) #define Thistle2 RGB(238,210,238) #define Thistle3 RGB(205,181,205) #define Thistle4 RGB(139,123,139) #define grey11 RGB( 28, 28, 28) #define grey21 RGB( 54, 54, 54) #define grey31 RGB( 79, 79, 79) #define grey41 RGB(105,105,105) #define grey51 RGB(130,130,130) #define grey61 RGB(156,156,156) #define grey71 RGB(181,181,181) #define gray81 RGB(207,207,207) #define gray91 RGB(232,232,232) #define DarkGrey RGB(169,169,169) #define DarkBlue RGB( 0, 0,139) #define DarkCyan RGB( 0,139,139) #define DarkMagenta RGB(139, 0,139) #define DarkRed RGB(139, 0, 0) #define LightGreen RGB(144,238,144) #endif
//led.c #include "led.h" #include <stdint.h> #include <stdbool.h> #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "inc/hw_gpio.h" #include "driverlib/sysctl.h" #include "driverlib/pin_map.h" #include "driverlib/rom_map.h" #include "driverlib/gpio.h" #include "driverlib/pwm.h" void LED_Init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 |GPIO_PIN_3); RED_0; BLUE_0; GREEN_0; } void RGB_Init() { MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1); MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 |GPIO_PIN_3); RED_0; BLUE_0; GREEN_0; MAP_GPIOPinConfigure(GPIO_PF1_M1PWM5); MAP_GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1); MAP_GPIOPinConfigure(GPIO_PF2_M1PWM6); MAP_GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_2); MAP_GPIOPinConfigure(GPIO_PF3_M1PWM7); MAP_GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_3); SysCtlPWMClockSet(SYSCTL_PWMDIV_2); PWMGenConfigure(PWM1_BASE, PWM_GEN_2,PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC); PWMGenConfigure(PWM1_BASE, PWM_GEN_3,PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC); PWMGenPeriodSet(PWM1_BASE, PWM_GEN_2,MAX_DUTY ); PWMGenPeriodSet(PWM1_BASE, PWM_GEN_3,MAX_DUTY ); PWMOutputState(PWM1_BASE,PWM_OUT_5_BIT, true); PWMOutputState(PWM1_BASE,PWM_OUT_6_BIT, true); PWMOutputState(PWM1_BASE,PWM_OUT_7_BIT, true); PWMGenEnable(PWM1_BASE, PWM_GEN_2); PWMGenEnable(PWM1_BASE, PWM_GEN_3); PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5,MAX_DUTY); PWMPulseWidthSet(PWM1_BASE, PWM_OUT_6,MAX_DUTY); PWMPulseWidthSet(PWM1_BASE, PWM_OUT_7,MAX_DUTY); } void RGB(double red,double green,double blue) { red=red/256.0*MAX_DUTY+1; green=green/256.0*MAX_DUTY+1; blue=blue/256.0*MAX_DUTY+1; if(red<0)red=1; if(green<0)green=1; if(blue<0)blue=1; PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5,(int)red); PWMPulseWidthSet(PWM1_BASE, PWM_OUT_6,(int)blue); PWMPulseWidthSet(PWM1_BASE, PWM_OUT_7,(int)green); }
6.电机
用单片机来操控电机可以说是自控方面最常遇到的情况了,当然其实现也比较简单。通过连接电机驱动模块就可以轻松使用I/O口来操控电机。这里的库函数实现了对单个单机的操控,当然可以再加上对多个电机的操控。
注:不同的电机模块的操作方式不尽相同,不过我也忘了我的模块型号是啥了……
//motor.h #ifndef MOTOR_H #define MOTOR_H void Motor_Init(); void Motor_Adjust(int Value); #endif
//motor.c #include "motor.h" #include <stdint.h> #include <stdbool.h> #include "inc/hw_memmap.h" #include "driverlib/pin_map.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/pwm.h" #include "driverlib/sysctl.h" void Motor_Init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPWMClockSet(SYSCTL_PWMDIV_4); SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0); GPIOPinConfigure(GPIO_PB6_M0PWM0); GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_6); PWMGenConfigure(PWM0_BASE, PWM_GEN_0,PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC); PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, 1000); PWMGenEnable(PWM0_BASE, PWM_GEN_0); PWMOutputState(PWM0_BASE,PWM_OUT_0_BIT, true); PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0,1); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_4|GPIO_PIN_5); GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4|GPIO_PIN_5, 0x0); } void Motor_Adjust(int Value) { if(Value<-100)Value=-100; if(Value>100)Value=100; if(Value<0) { Value=-Value; Value=(Value+100)/2; PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, Value*10); GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4|GPIO_PIN_5, ~GPIO_PIN_4|GPIO_PIN_5); } else if(Value>0) { Value=(Value+100)/2; PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, Value*10); GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_4|~GPIO_PIN_5); } else if(Value==0) { Value=1; PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, Value*10); } }
7.OLED
使用单片机通过屏幕输出信息也是非常常见的需求,这里贴的代码改编自我的一位学长,这代码调用起来也是相当方便的。
//oled.h /* * oled.h * * Created on: 2016年10月17日 * Author: weycen */ #ifndef OLED_H_ #define OLED_H_ #include <stdint.h> /* Peripheral definitions for EK-TM4C123G board */ // I2C port #define OLED_I2C_BASE I2C0_BASE #define OLED_I2C_SYSCTL_PERIPH SYSCTL_PERIPH_I2C0 // GPIO for I2C pins #define OLED_GPIO_PORT_BASE GPIO_PORTB_BASE #define OLED_GPIO_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOB #define OLED_I2C_SCL GPIO_PIN_2 #define OLED_I2C_SDA GPIO_PIN_3 #define OLED_I2C_PINS (OLED_I2C_SCL | OLED_I2C_SDA) // GPIO pin configuer #define OLED_GPIO_I2C_SCL GPIO_PB2_I2C0SCL #define OLED_GPIO_I2C_SDA GPIO_PB3_I2C0SDA // commands define #define OLED_I2C_ADDR 0x3C #define OLED_I2C_DAT 0x40 #define OLED_I2C_CMD 0x00 #define WRITE false #define READ true #define OLED_CMD 1 #define OLED_DAT 0 #define OLED_DELAY 600 extern void DelayXms(uint16_t xms); extern void OLED_I2CInit(void); extern void OLED_DrawPiexl(uint8_t u8X,uint8_t u8Y,bool bFILL); extern void OLED_FillScreen(void); extern void LCDDrawLine(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1,bool FILL); extern void OLED_ClearScreen(); extern void OLED_DisplayChinese(uint8_t u8X,uint8_t u8Y,uint8_t number); extern void OLED_DisplayChar(uint8_t u8X,uint8_t u8Y,uint8_t chr); extern void OLED_DisplayNumber(uint8_t u8X,uint8_t u8Y,double num,uint8_t dec_dig); #endif /* OLED_H_ */
//oled.c /* * oled.c * * Created on: 2016年10月17日 * Author: weycen */ ////OLED的显存 ////存放格式如下. ////[0]0 1 2 3 ... 127 // . // . // . // . // . // . // . // . ////[1]0 1 2 3 ... 127 ////[2]0 1 2 3 ... 127 ////[3]0 1 2 3 ... 127 ////[4]0 1 2 3 ... 127 ////[5]0 1 2 3 ... 127 ////[6]0 1 2 3 ... 127 ////[7]0 1 2 3 ... 127 #include <stdint.h> #include <stdio.h> #include <math.h> #include <stdbool.h> #include <string.h> #include "inc/hw_memmap.h" #include "inc/hw_i2c.h" #include "inc/hw_sysctl.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/i2c.h" #include "oled.h" #include "oled_font.h" #include "libraries/delay/delay.h" /***********************************/ void OLED_Configuer(void); void OLED_SetPosition(uint8_t u8X , uint8_t u8Y); void OLED_I2CSendByte(uint8_t CMD_or_DAT, uint8_t Byte); void OLED_FillScreen(void); /************************************/ /*************************************************** * 延时 s函数 * ***********************************************/ void DelayXs(uint16_t xs) { SysCtlDelay(xs*(SysCtlClockGet() / 3)); } /*************************************************** * 延时 ms函数 * ***********************************************/ void DelayXms(uint16_t xms) { SysCtlDelay(xms*(SysCtlClockGet() / 3000)); } /*************************************************** * 延时 us函数 * ***********************************************/ void DelayXus(uint16_t xus) { SysCtlDelay(xus*(SysCtlClockGet() / 3000000)); } //**************************************** // // init oled I2C // //**************************************** void OLED_I2CInit(void) { // SysCtlPeripheralEnable(OLED_GPIO_SYSCTL_PERIPH); SysCtlPeripheralEnable(OLED_I2C_SYSCTL_PERIPH); // GPIOPinTypeI2CSCL(OLED_GPIO_PORT_BASE, OLED_I2C_SCL); GPIOPinTypeI2C(OLED_GPIO_PORT_BASE, OLED_I2C_SDA); // GPIOPinConfigure(GPIO_PB2_I2C0SCL); GPIOPinConfigure(GPIO_PB3_I2C0SDA); // I2CMasterInitExpClk(OLED_I2C_BASE, SysCtlClockGet(), true); // OLED_Configuer(); delay_ms(200); OLED_ClearScreen(); } // // oled初始设置 // void OLED_Configuer(void) { /* display off */ OLED_I2CSendByte(OLED_CMD,0xAE); /* set lower column address */ OLED_I2CSendByte(OLED_CMD,0x00); /* set higher column address */ OLED_I2CSendByte(OLED_CMD,0x10); /* set display start line */ OLED_I2CSendByte(OLED_CMD,0x40); /* set page address */ OLED_I2CSendByte(OLED_CMD,0xB0); /* contract control */ OLED_I2CSendByte(OLED_CMD,0x81); OLED_I2CSendByte(OLED_CMD,0x66); /* set segment remap */ OLED_I2CSendByte(OLED_CMD,0xA1); /* normal / reverse */ OLED_I2CSendByte(OLED_CMD,0xA6); /* multiplex ratio */ OLED_I2CSendByte(OLED_CMD,0xA8); /* duty = 1/64 */ OLED_I2CSendByte(OLED_CMD,0x3F); /* Com scan direction */ OLED_I2CSendByte(OLED_CMD,0xC8);/* c3*/ /* set display offset */ OLED_I2CSendByte(OLED_CMD,0xD3); OLED_I2CSendByte(OLED_CMD,0x00); /* set osc division */ OLED_I2CSendByte(OLED_CMD,0xD5); OLED_I2CSendByte(OLED_CMD,0x80); /* set area color mode off */ OLED_I2CSendByte(OLED_CMD,0xD8); OLED_I2CSendByte(OLED_CMD,0x05); /* set pre-charge period */ OLED_I2CSendByte(OLED_CMD,0xD9); OLED_I2CSendByte(OLED_CMD,0xF1); /* set COM pins */ OLED_I2CSendByte(OLED_CMD,0xDA); OLED_I2CSendByte(OLED_CMD,0x12); /* set vcomh */ OLED_I2CSendByte(OLED_CMD,0xDB); OLED_I2CSendByte(OLED_CMD,0x30); /* set charge pump disable */ OLED_I2CSendByte(OLED_CMD,0x8D); OLED_I2CSendByte(OLED_CMD,0x14); /* display on*/ OLED_I2CSendByte(OLED_CMD,0xAF); } // // I2C发送一个字节 // void OLED_I2CSendByte(uint8_t CMD_or_DAT,uint8_t Byte) { uint8_t i2cWriteBuffer; // frame 1: send slave_addr + R/W 0011 1100 I2CMasterSlaveAddrSet(OLED_I2C_BASE, OLED_I2C_ADDR, false); // frame 2: I2CMasterControl(OLED_I2C_BASE, I2C_MASTER_CMD_BURST_SEND_START); // i2cWriteBuffer = (CMD_or_DAT == OLED_CMD) ? OLED_I2C_CMD : OLED_I2C_DAT; // frame 3: I2CMasterDataPut(OLED_I2C_BASE, i2cWriteBuffer); I2CMasterControl(OLED_I2C_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); // wait for master free while(I2CMasterBusy(OLED_I2C_BASE)) ; // frame 4: i2cWriteBuffer = Byte; I2CMasterDataPut(OLED_I2C_BASE, i2cWriteBuffer); // wait for master free while(I2CMasterBusy(OLED_I2C_BASE)) ; I2CMasterControl(OLED_I2C_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH); // wait for master free while(I2CMasterBusy(OLED_I2C_BASE)) ; } // // 在指定位置打点函数 // bFILL: true 填充 ,false 清除 void OLED_DrawPiexl(uint8_t u8X,uint8_t u8Y,bool bFILL) { uint8_t temp; // 限幅 u8X = u8X > 127 ? 127 : u8X; u8Y = u8Y > 63 ? 63 : u8Y; if( bFILL ) temp = 0x01 << ( u8Y % 8 ); else temp = ~ ( 0x01 << ( u8Y % 8 ) ); // 设置目标点page OLED_SetPosition(u8X,u8Y); // 发送目标点数据 OLED_I2CSendByte(OLED_DAT,temp); } // // 设置坐标位置 x:0-127, y:0-63 // void OLED_SetPosition( uint8_t u8X , uint8_t u8Y ) { OLED_I2CSendByte( OLED_CMD , 0xB0 + u8Y / 8 ); // y page OLED_I2CSendByte( OLED_CMD , ( ( u8X & 0xF0 ) >> 4 ) | 0x10 ); // x轴 OLED_I2CSendByte( OLED_CMD , ( u8X & 0x0F ) ); } //void OLED_SetPosition( uint8_t u8X , uint8_t u8Y ) //{ // OLED_I2CSendByte( OLED_CMD , 0xB0 + u8Y); // y page // OLED_I2CSendByte( OLED_CMD , ( ( u8X & 0xF0 ) >> 4 ) | 0x10 ); // x轴 // OLED_I2CSendByte( OLED_CMD , ( u8X & 0x0F ) ); //} // // 打开显示 // void OLED_DisplayOn(void) { OLED_I2CSendByte(OLED_CMD,0X8D); //SET DCDC命令 OLED_I2CSendByte(OLED_CMD,0X14); //DCDC ON OLED_I2CSendByte(OLED_CMD,0XAF); //DISPLAY ON } // // 关闭显示 // void OLED_DisplayOff(void) { OLED_I2CSendByte(OLED_CMD,0X8D); //SET DCDC命令 OLED_I2CSendByte(OLED_CMD,0X10); //DCDC off OLED_I2CSendByte(OLED_CMD,0XAE); //DISPLAY off } // // 清屏函数 // void OLED_ClearScreen(void) { // uint8_t x,y; // for(x=0;x<128;x++) // 128列 // { // for(y=0;y<8;y++) // { // OLED_SetPosition(x,y*8); // 8页 // OLED_I2CSendByte(OLED_DAT,0x00); //每页竖着8位均写0 // } // } uint8_t i,n; for(i=0;i<8;i++) { OLED_I2CSendByte(OLED_CMD,0xB0 + i); OLED_I2CSendByte(OLED_CMD,0x00); OLED_I2CSendByte(OLED_CMD,0x10); for(n=0;n<128;n++) OLED_I2CSendByte(OLED_DAT,0x0); } //更新显示 } // // oled写满屏 // void OLED_FillScreen(void) { // uint8_t x,y; // for(x=0;x<128;x++) // 128列 // { // for(y=0;y<8;y++) // { // OLED_SetPosition(x,y*8); // 8页 // OLED_I2CSendByte(OLED_DAT,0xFF); //每页竖着8位均写0 // } // } uint8_t i,n; for(i=0;i<8;i++) { OLED_I2CSendByte(OLED_CMD,0xB0 + i); OLED_I2CSendByte(OLED_CMD,0x00); OLED_I2CSendByte(OLED_CMD,0x10); for(n=0;n<128;n++) OLED_I2CSendByte(OLED_DAT,0xAA); } //更新显示 } /************************************************************* 函数名: LCDDrawLine 函数说明:使用Bresenham法,画任意两点间的直线 传入参数:(x0,y0),竖直线的起点;(x1,y1)竖直线的终点 color=1,点亮;color=0,擦除 传出参数:无 返回值: 无 ************************************************************/ void LCDDrawLine(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1,bool FILL) { int32_t dx; // 直线x轴差值变量 int32_t dy; // 直线y轴差值变量 int32_t dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向 int32_t dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向 int32_t dx_2; // dx*2值变量,用于加快运算速度 int32_t dy_2; // dy*2值变量,用于加快运算速度 int32_t di; // 决策变量 dx = x1-x0; // 求取两点之间的差值 dy = y1-y0; if(dx<0) dx_sym=-1; else{ if(dx>0) dx_sym=1; } if(dy>0) dy_sym=1; else{ if(dy<0) dy_sym=-1; } dx=dx_sym*dx; dy=dy_sym*dy; dx_2=dx*2; dy_2=dy*2; if(dx>=dy) { di=dy_2-dx; while(x0!=x1) { OLED_DrawPiexl(x0,y0,FILL); x0+=dx_sym; if(di<0) di+=dy_2; else{ di+=dy_2-dx_2; y0+=dy_sym; } } OLED_DrawPiexl(x0,y0,FILL); }else{ di=dx_2-dy; while(y0!=y1) { OLED_DrawPiexl(x0,y0,FILL); y0+=dy_sym; if(di<0) di+=dx_2; else{ di+=dx_2-dy_2; x0+=dx_sym; } } OLED_DrawPiexl(x0,y0,FILL); } } // //显示汉字 // void OLED_DisplayChinese(uint8_t u8X,uint8_t u8Y,uint8_t number) { uint8_t i/*adder=0*/; uint8_t temp; temp = 2 * number; OLED_SetPosition(u8X,u8Y); // 起始点,即页 for( i = 0; i < 16; i++ ) { OLED_I2CSendByte( OLED_DAT, FONT_16_16[ temp ][ i ] ); //OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); //adder + = 1; } OLED_SetPosition( u8X, u8Y + 8 ); // 移到下一页 for( i = 0; i < 16; i++ ) { OLED_I2CSendByte( OLED_DAT, FONT_16_16[ temp + 1 ][ i ] ); //OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); //adder+=1; } } //在指定位置显示一个字符,包括部分字符 //x:0~127 //y:0~63 //mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void OLED_DisplayChar(uint8_t u8X,uint8_t u8Y,uint8_t chr) { uint8_t i=0 , c=0; uint16_t temp ; c = chr-' ';//得到偏移后的值 asic码值 temp = c*16; // if(Char_Size ==16) // { OLED_SetPosition(u8X,u8Y); for(i=0;i<8;i++) OLED_I2CSendByte(OLED_DAT,FONT_8_16[temp+i]); OLED_SetPosition(u8X,u8Y+8); for(i=0;i<8;i++) OLED_I2CSendByte(OLED_DAT,FONT_8_16[temp+i+8]); // } // else { // OLED_SetPosition(u8X,u8Y); // for(i=0;i<6;i++) // OLED_I2CSendByte(OLED_DAT,FONT_8_16[c][i]); // } } /************************************************** *名称:void disp_num(double num,uchar dec_dig) *功能:显示任意实数,并可设定保留小数位数,且有四舍五入功能 *入口参数:num :要显示的数 , dec_dig :保留小数位 **************************************************/ void OLED_DisplayNumber(uint8_t u8X,uint8_t u8Y,double num,uint8_t dec_dig) { //uint32_t a; int num_int,num_dec_int,m=0,k=0,j; double num_dec; uint8_t xtemp,ytemp; xtemp =u8X; ytemp =u8Y; uint8_t integ[ 10 ],decim[ 10 ]; num_int = ( int )( num + 5 * pow( 10,-( dec_dig + 1 ) ) );/* a= 1234 */ num_dec = num - num_int; /* b= 0.5678 */ for( j = num_int; j > 0; j = j / 10 ) { integ[k++]=j % 10; /* 整数位分解 */ } num_dec_int = ( int )( num_dec * pow( 10 , dec_dig ) ); /* 小数位变整数 */ for(j=num_dec_int;j>0;j=j/10) { decim[m++]=j%10; /* 小数位分解 */ } /* 显示整数位 */ for(j=k-1;j>=0;j--) { OLED_DisplayChar(xtemp,ytemp,integ[j]+48); //LCDSendData(DAT,integ[j]+48); xtemp+=8; } if(num_int==0) { OLED_DisplayChar(xtemp,ytemp,'0'); //LCDSendData(DAT,'0'); xtemp+=8; } /* 显示整数 小数之间小数点*/ OLED_DisplayChar(xtemp,ytemp,'.'); //LCDSendData(DAT,'.'); xtemp+=8; /* 显示小数位 */ for(j=dec_dig-1;j>=0;j--) { OLED_DisplayChar(xtemp,ytemp,decim[j]+48); //LCDSendData(DAT,decim[j]+48); xtemp+=8; } }
8.PWM
其实之前led的时候已经用过pwm了,不过这个库函数的目的是通过其他的I/O口输出PWM波,所以把它们分成了两个文件。
//pwm.h #ifndef PWM_H #define PWM_H #include <stdint.h> #include <stdbool.h> void PWM_Init(uint32_t ui32Frequency);//初始化PWM输出 void Adjust_PWM(int duty,int frequency);//调整PWM频率和占空比(参数为0表示不改变) #endif
//pwm.c #include "pwm.h" #include <stdint.h> #include <stdbool.h> #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "inc/hw_ints.h" #include "inc/hw_timer.h" #include "driverlib/rom.h" #include "driverlib/gpio.h" #include "driverlib/pwm.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/timer.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" #include "driverlib/rom_map.h" int _frequency=0; void PWM_Init(uint32_t ui32Frequency) { _frequency=ui32Frequency; SysCtlPWMClockSet(SYSCTL_PWMDIV_1); SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); GPIOPinConfigure(GPIO_PA6_M1PWM2); GPIOPinTypePWM(GPIO_PORTA_BASE, GPIO_PIN_6); PWMGenConfigure(PWM1_BASE, PWM_GEN_1, PWM_GEN_MODE_DOWN |PWM_GEN_MODE_NO_SYNC); PWMGenPeriodSet(PWM1_BASE, PWM_GEN_1, SysCtlClockGet()/ui32Frequency); PWMPulseWidthSet(PWM1_BASE, PWM_OUT_2, PWMGenPeriodGet(PWM1_BASE, PWM_GEN_1)/2); PWMOutputState(PWM1_BASE, PWM_OUT_2_BIT, true); PWMGenEnable(PWM1_BASE, PWM_GEN_1); } void Adjust_PWM(int duty,int frequency) { static int _duty=50; if(!duty) { PWMGenPeriodSet(PWM1_BASE, PWM_GEN_1, SysCtlClockGet()/_frequency); PWMPulseWidthSet(PWM1_BASE, PWM_OUT_2, PWMGenPeriodGet(PWM1_BASE, PWM_GEN_1)*(_duty/2)); } }
9.编码器
同样地,编码器也是十分重要的内容,这里的驱动库实现了对于编码器的各种数值的获取。当然,这也是改编自学长的。
//QEI_Model.h /* * QEI_Model.h * * Created on: 2018年1月29日 * Author: bobo */ #ifndef QEI_MODEL_H_ #define QEI_MODEL_H_ typedef struct { uint32_t periph; uint32_t base; uint32_t swap_flag; uint32_t Qinterrupt; uint32_t gpio_periph; uint32_t gpio_port; uint8_t gpio_pin; uint32_t gpio_cfg_a; uint32_t gpio_cfg_b; int32_t dir; int32_t velocity; /* unit: pulse edge per second */ // int32_t Init_Pos; uint32_t Now_Pos; //0~1040 }user_qei_data_t; extern user_qei_data_t qei_data_array[2]; //extern void QEI_InitConfig(user_qei_data_t *qei_data); extern void QEI_Config(void); extern void QEI0_IRQHandler(void); #endif /* QEI_MODEL_H_ */
//QEI_Model.h #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/qei.h" #include "inc/hw_memmap.h" #include "inc/hw_gpio.h" #include "driverlib/interrupt.h" #include "inc/hw_types.h" #include "QEI_Model.h" #define MOTOR_QEI_VEL_FREQ 10 bool Init_flag = true; //void QEI_InitConfig(user_qei_data_t *qei_data); void QEI_Config(void); user_qei_data_t qei_data_array[2] = { { //QEI0: D6,D7 .periph = SYSCTL_PERIPH_QEI0, .base = QEI0_BASE, .swap_flag = QEI_CONFIG_SWAP, .Qinterrupt = INT_QEI0, .gpio_periph = SYSCTL_PERIPH_GPIOD, .gpio_port = GPIO_PORTD_BASE, .gpio_pin = (GPIO_PIN_6 | GPIO_PIN_7), .gpio_cfg_a = GPIO_PD6_PHA0, .gpio_cfg_b = GPIO_PD7_PHB0, .dir = 1, .velocity = 0, .Init_Pos = 0, .Now_Pos = 0, }, { .periph = SYSCTL_PERIPH_QEI1, .base = QEI1_BASE, .swap_flag = QEI_CONFIG_NO_SWAP, .Qinterrupt = INT_QEI1, .gpio_periph = SYSCTL_PERIPH_GPIOC, .gpio_port = GPIO_PORTC_BASE, .gpio_pin = (GPIO_PIN_5 | GPIO_PIN_6), .gpio_cfg_a = GPIO_PC5_PHA1, .gpio_cfg_b = GPIO_PC6_PHB1, .dir = 1, .velocity = 0, .Init_Pos = 0, .Now_Pos = 0, }, }; void QEI_InitConfig(user_qei_data_t *qei_data) { // // Enable the QEI0 peripheral // SysCtlPeripheralEnable(qei_data->periph); // // Wait for the QEI0 module to be ready. // while(!SysCtlPeripheralReady(qei_data->periph)); // // Configure gpio // SysCtlPeripheralEnable(qei_data->gpio_periph); while(!SysCtlPeripheralReady(qei_data->gpio_periph)); if(qei_data->gpio_port == GPIO_PORTD_BASE && (qei_data->gpio_pin & GPIO_PIN_7)) { // // unlock PF0 // HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = 0x4C4F434B; HWREG(GPIO_PORTD_BASE + GPIO_O_CR) |= GPIO_PIN_7; HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = 0x00; } GPIOPinConfigure(qei_data->gpio_cfg_a); GPIOPinConfigure(qei_data->gpio_cfg_b); GPIOPinTypeQEI(qei_data->gpio_port, qei_data->gpio_pin); // // Configure the quadrature encoder to capture edges on both signals and // maintain an absolute position by resetting on index pulses. Using a // 1000 line encoder at four edges per line, there are 4000 pulses per // revolution; therefore set the maximum position to 3999 as the count // is zero based. //1040 -> 0x410 QEIConfigure(qei_data->base, (QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUADRATURE | qei_data->swap_flag), 0x410); // // Enable the quadrature encoder. // QEIEnable(qei_data->base); // // Configure qei velocity // QEIVelocityConfigure(qei_data->base, QEI_VELDIV_1, SysCtlClockGet() / MOTOR_QEI_VEL_FREQ); QEIVelocityEnable(qei_data->base); QEIIntEnable(qei_data->base, QEI_INTDIR | QEI_INTTIMER); IntEnable(qei_data->Qinterrupt); //INT_QEI0 //IntRegister(INT_QEI0,QEI0_IRQHandler); } void QEI_Config(void) { // uint32_t i; // for(i = 0; i < sizeof(qei_data_array) / sizeof(qei_data_array[0]); i++) // { // QEI_InitConfig(qei_data_array + i); // SysCtlDelay(SysCtlClockGet()*10/3000); // } QEI_InitConfig(qei_data_array+0); SysCtlDelay(SysCtlClockGet()*5/3000); } void qei_irq_handler(int32_t QEInum) { uint32_t status = QEIIntStatus(qei_data_array[QEInum].base, true); QEIIntClear(qei_data_array[QEInum].base, status); if(status & QEI_INTTIMER) { qei_data_array[QEInum].velocity = QEIVelocityGet(qei_data_array[QEInum].base) * MOTOR_QEI_VEL_FREQ * QEIDirectionGet(qei_data_array[QEInum].base); //qei_data_array[QEInum].Now_Pos = QEIPositionGet(qei_data_array[QEInum].base); } if(status & QEI_INTDIR) { qei_data_array[QEInum].dir = -qei_data_array[QEInum].dir; } if(Init_flag) { qei_data_array[QEInum].Init_Pos = QEIPositionGet(qei_data_array[QEInum].base); Init_flag = false; } QEIPositionGet(qei_data_array[QEInum].base); QEIVelocityGet(qei_data_array[QEInum].base) * MOTOR_QEI_VEL_FREQ * QEIDirectionGet(qei_data_array[QEInum].base); } void QEI0_IRQHandler(void) { qei_irq_handler(0); }
10.定时器
定时器是每一个项目中都必然会用到的东西,这里写的定时器驱动库编写了定时器0和1的普通使用以及使用其溢出中断。
//timer.h # ifndef TIMER_H # define TIMER_H void Timer0_Int_Init();//定时器带溢出中断的初始化 void Timer1_Int_Init(); void Timer0BIntHandler();//定时器中断处理函数 void Timer1BIntHandler(); void Timer_Init();//定时器不带中断的初始化 #endif
//timer.c #include "timer.h" #include <stdint.h> #include <stdbool.h> #include "inc/hw_memmap.h" #include "inc/hw_ints.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/timer.h" #include "driverlib/uart.h" #include "driverlib/rom_map.h" #include "driverlib/rom.h" #include "utils/uartstdio.h" #include "libraries/LED/led.h" int timer_flag=0; extern int mode; void Timer0_Int_Init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); TimerClockSourceSet(TIMER0_BASE, TIMER_CLOCK_SYSTEM); TimerPrescaleSet(TIMER0_BASE, TIMER_B, 16 - 1); TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PERIODIC); TimerLoadSet(TIMER0_BASE, TIMER_B, ((SysCtlClockGet() / (TimerPrescaleGet(TIMER0_BASE, TIMER_B) + 1)) / 50) - 1); TimerIntRegister(TIMER0_BASE, TIMER_B, Timer0BIntHandler); TimerIntEnable(TIMER0_BASE, TIMER_TIMB_TIMEOUT); IntEnable(INT_TIMER0B); TimerEnable(TIMER0_BASE, TIMER_B); IntMasterEnable(); } void Timer0BIntHandler() { } void Timer_Init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC_UP); TimerLoadSet(TIMER0_BASE, TIMER_A, 0xFFFFFFFF); IntDisable(INT_TIMER0A); TimerEnable(TIMER0_BASE, TIMER_A); IntMasterEnable(); } void Timer1_Int_Init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); TimerClockSourceSet(TIMER1_BASE, TIMER_CLOCK_SYSTEM); TimerPrescaleSet(TIMER1_BASE, TIMER_B, 16 - 1); TimerConfigure(TIMER1_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PERIODIC); TimerLoadSet(TIMER1_BASE, TIMER_B, ((SysCtlClockGet() / (TimerPrescaleGet(TIMER1_BASE, TIMER_B) + 1)) / 500) - 1); TimerIntRegister(TIMER1_BASE, TIMER_B, Timer1BIntHandler); TimerIntEnable(TIMER1_BASE, TIMER_TIMB_TIMEOUT); IntEnable(INT_TIMER1B); TimerEnable(TIMER1_BASE, TIMER_B); IntMasterEnable(); } void Timer1BIntHandler() { }
11.串口
串口也是很重要的东西啊!我写的串口库包括了普通模式和带接受中断的模式,适用于不同的情景下。我写的这个库包括了串口0和串口1的初始化,基本上能满足大部分情况了。
//uart.h #ifndef UART_H #define UART_H #include <stdint.h> #include <stdbool.h> void UART0_Init(uint32_t ui32Baud);//串口0初始化 void UART0_Int_Init(uint32_t ui32Baud);//串口0中断初始化 void UART0IntHandler();//串口0中断处理函数 bool UARTDataDeal(char *pui8Data);//串口接收信息处理函数 void UART1_Init(uint32_t ui32Baud);//串口1初始化 void UART1_Int_Init(uint32_t ui32Baud);//串口1中断初始化 void UART1IntHandler();//串口1中断处理函数 #endif
//uart.c #include "uart.h" #include <stdint.h> #include <stdbool.h> #include <stdlib.h> #include <string.h> #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_ints.h" #include "inc/hw_gpio.h" #include "driverlib/pin_map.h" #include "driverlib/gpio.h" #include "driverlib/sysctl.h" #include "driverlib/interrupt.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" #include "../LED/led.h" #include "../delay/delay.h" int speed=100; extern int mode; void UART0_Init(uint32_t ui32Baud) { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); UARTStdioConfig(0, ui32Baud, SysCtlClockGet()); } void UART0_Int_Init(uint32_t ui32Baud) { SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); UARTStdioConfig(0, ui32Baud, SysCtlClockGet()); UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), ui32Baud,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE)); UARTFIFOEnable(UART0_BASE); UARTFIFOLevelSet(UART0_BASE,UART_FIFO_TX2_8,UART_FIFO_TX4_8); UARTIntEnable(UART0_BASE, UART_INT_RX); IntPrioritySet (INT_UART0, 0xE0); // UARTIntRegister(UART0_BASE, UART0IntHandler); IntEnable(INT_UART0); IntMasterEnable(); } void UART0IntHandler() { char ui8RxBuffer[10]={0}; uint8_t i = 0; UARTIntClear(UART0_BASE, UARTIntStatus(UART0_BASE, true)); delay_ms(1); while(UARTCharsAvail(UART0_BASE)) { ui8RxBuffer[i++] =(uint8_t)UARTCharGetNonBlocking(UART0_BASE); if(ui8RxBuffer[i-1]=='\n') { ui8RxBuffer[i-1]=0; i=0; break; } } UARTDataDeal(ui8RxBuffer); } bool UARTDataDeal(char *pui8Data) { char input[10]={0}; int temp=100; input[0]=pui8Data[0]; input[1]=pui8Data[1]; input[2]=pui8Data[2]; input[3]=pui8Data[3]; input[4]=pui8Data[4]; input[5]=pui8Data[5]; input[6]=pui8Data[6]; input[7]=pui8Data[7]; if(mode==1) { if(input[4]=0,!strcmp(input,"dir+")) { UARTprintf("back:dir+\n"); speed=abs(speed); return true; } else if(input[4]=0,!strcmp(input,"dir-")) { UARTprintf("back:dir-\n"); speed=-1*abs(speed); return true; } else if(input[0]=='s'&&input[1]=='p'&&input[2]=='e'&&input[3]=='e') { temp=atoi(input+5); if(temp>180||temp<40) { temp=100; UARTprintf("wrong!\n"); } if(speed>0)speed=temp; else speed=-1*temp; UARTprintf("Speed=%d\n",speed); return true; } } UARTprintf("wrong enter!\n"); return false; } void UART1_Init(uint32_t ui32Baud) { SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinConfigure(GPIO_PB0_U1RX); GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0); GPIOPinConfigure(GPIO_PB1_U1TX); GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_1); UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(), 115200,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE)); UARTEnable(UART1_BASE); } void UART1_Int_Init(uint32_t ui32Baud) { HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x1; SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1); GPIOPinConfigure(GPIO_PB0_U1RX); GPIOPinConfigure(GPIO_PB1_U1TX); GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); UARTStdioConfig(0, ui32Baud, SysCtlClockGet()); UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(), ui32Baud,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE)); UARTFIFOEnable(UART1_BASE); UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX2_8,UART_FIFO_TX2_8); UARTIntEnable(UART1_BASE, UART_INT_RX); IntPrioritySet (INT_UART1, 0xE0); UARTIntRegister(UART1_BASE, UART1IntHandler); IntEnable(INT_UART1); IntMasterEnable(); } void UART1IntHandler() { }
以上就是这次tm4基础学习中我配置的驱动库啦~希望我能在接下来的学习中学到更多知识!
发表评论