由于我参加了自控方向的电赛,而我们省的电赛又是由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基础学习中我配置的驱动库啦~希望我能在接下来的学习中学到更多知识!