南城区做网站,平面设计实习报告,留言小程序模板,西安网站建设gj前言 #xff08;1#xff09;学习本文之前#xff0c;需要先学习前两篇文章。 #xff08;2#xff09;学习本文需要准备好TTL转USB模块。 函数介绍
ROM_GPIOPinConfigure#xff08;#xff09; 配置GPIO引脚的复用功能。因为引脚不可能只有一个输出输入作用#xf…前言 1学习本文之前需要先学习前两篇文章。 2学习本文需要准备好TTL转USB模块。 函数介绍
ROM_GPIOPinConfigure 配置GPIO引脚的复用功能。因为引脚不可能只有一个输出输入作用还可能能够当作复用引脚。所以这个函数用于当IO需要用于其他功能的时候调用这个函数。 /****** 函数声明 ******/
//这个存放在ROM
void ROM_GPIOPinConfigure(uint32_t ui32PinConfig);
//这个是存放在flash
void GPIOPinConfigure(uint32_t ui32PinConfig);/****** 函数介绍 ******/
/* 作用 配置GPIO引脚的复用功能。* 传入参数 参数在 pin_map.h 中选择,例如 GPIOPinConfigure(GPIO_PB0_U1RX);是把 PB0 复用为
U1RX* 返回参数 无
*/
ROM_GPIOPinTypeUART 配置UART外设使用的引脚。 /****** 函数声明 ******/
//这个存放在ROM
void ROM_GPIOPinTypeUART(uint32_t ui32Port,uint8_t ui8Pins);
//这个是存放在flash
void GPIOPinTypeUART(uint32_t ui32Port,uint8_t ui8Pins);/****** 函数介绍 ******/
/* 作用 配置UART外设使用的引脚。* 传入参数 * ui32Port GPIO口的基地地址GPIO_PORTx_BASEx可为A,B,C,D,E,F,G,H* ui8Pins : GPIO_PIN_X,x可为1,2,3,4,5,6,7* 返回参数 无
*/
ROM_UARTConfigSetExpClk 1设置UART的配置。 2这里需要注意一个点UARTStdioConfig函数也可以配置串口但是我个人不建议使用这个配置。因为这个函数配置了之后默认为使用 8 位数据没有奇偶校验位1 停止位。虽然我们后面也是这样配置。 3UARTStdioConfig这个函数有一个很重要的点如果是调用这个函数配置的串口可以使用UARTprintf函数却不能使用UARTCharput函数用UARTConfigSetExpClk配置的函数可以使用UARTCharput函数却不能使用UARTprintf函数。 4UARTprintf是一个伪printf函数使用方法与printf函数一致。但是这样做的话会有两个问题 1如果调用UARTprintf函数但是单片机有多个串口同时打开了都需要输出。这样UARTprintf函数到底是对应的哪一个串口呢 2这个函数使用起来不灵活。比如数据类型限制UARTprintf函数只支持有限的数据类型例如整数和浮点数等。如果需要输出其他数据类型可能需要自己编写输出函数。格式化限制UARTprintf函数使用标准的printf格式化字符串语法但是并不支持所有的printf格式化字符串选项。例如它不支持长整型long和长双精度浮点型long double等类型。缓冲区大小限制UARTprintf函数使用一个内部的静态缓冲区来存储格式化后的字符串因此输出的字符串长度受到缓冲区大小的限制。如果输出的字符串长度超过了缓冲区大小可能会导致输出不完整或被截断。 /****** 函数声明 ******/
//这个存放在ROM
void ROM_UARTConfigSetExpClk(uint32_t ui32Base,uint32_t ui32UARTClk,uint32_t ui32Baud,uint32_t ui32Config);
//这个是存放在flash
void UARTConfigSetExpClk(uint32_t ui32Base,uint32_t ui32UARTClk,uint32_t ui32Baud,uint32_t ui32Config);/****** 函数介绍 ******/
/* 作用 设置UART的配置。* 传入参数 * ui32Base UART端口的基地址* ui32UARTClk : 提供给UART模块的时钟速率。* ui32Baud : 波特率* ui32Config : 可选参数如下* 数据位 UART_CONFIG_WLEN_88数据位,UART_CONFIG_WLEN_77数据位,UART_CONFIG_WLEN_66数据位,UART_CONFIG_WLEN_55数据位* 停止位 UART_CONFIG_STOP_ONE1停止位UART_CONFIG_STOP_TWO 2停止位* 校验位 UART_CONFIG_PAR_NONE无校验位 UART_CONFIG_PAR_EVEN偶校验UART_CONFIG_PAR_ODD 奇校验UART_CONFIG_PAR_ONE 1校验UART_CONFIG_PAR_ZERO 0校验* 返回参数 无
*/
ROM_UARTFIFODisable 1用于禁用FIFO。 2FIFO是一个寄存器串口通讯的数据可以将FIFO作为中转站CPU需要发送数据就将数据一次性发给FIFO然后FIFO来处理。如果接收数据也是先将数据接收到FIFO中然后CPU再去处理。这样做的好处 1这样做允许串口同时处理多个字符而不需要等待每个字符都被处理完毕。这可以减少串口通信的延迟提高通信效率。 2允许串口同时处理多个字符而不需要等待每个字符都被处理完毕。这可以减少串口通信的延迟提高通信效率。 3当使能FIFO缓冲区时串口接收到的数据将被存储在FIFO缓冲区中而不是直接传输到接收缓冲区。这可以减少中断的数量从而提高系统响应速度。注意这样做的话串口的实时性就会降低很多 3因为我们想要串口接收到数据就马上进行反应所以我们将FIFO禁用。 /****** 函数声明 ******/
//这个存放在ROM
void ROM_UARTFIFODisable(uint32_t ui32Base);
//这个是存放在flash
void ROM_UARTFIFODisable(uint32_t ui32Base);/****** 函数介绍 ******/
/* 作用 用于禁用FIFO。* 传入参数 * ui32Base 要禁用FIFO的UART端口的基地址* 返回参数 无
*/
ROM_UARTIntEnable 启用单独的UART中断源。 /****** 函数声明 ******/
//这个存放在ROM
void ROM_UARTIntEnable(uint32_t ui32Base,uint32_t ui32IntFlags);
//这个是存放在flash
void UARTIntEnable(uint32_t ui32Base,uint32_t ui32IntFlags);/****** 函数介绍 ******/
/* 作用 用于禁用FIFO。* 传入参数 * ui32Base UART端口的基地址* ui32IntFlags UART_INT_9BIT9位地址匹配中断UART_INT_OE错误中断接收到的数据中出现了错误的“停止位”UART_INT_BE错误中断数据接收器的缓冲区已满时继续接收数据而导致之前接收到的数据被覆盖从而引发中断UART_INT_PE奇偶校验错误中断UART_INT_FE帧错误中断UART_INT_RT接收超时中断UART_INT_TX发送中断UART_INT_RX接收中断UART_INT_DSRDSR中断),UART_INT_DCDDCD中断),UART_INT_CTSCTS中断),UART_INT_RIRI中断)* 返回参数 无
*/
UARTIntRegister 1UART中断函数注册 2这个的ROM函数似乎没有 /****** 函数声明 ******/
//这个是存放在flash
void UARTIntRegister(uint32_t ui32Base, void (*pfnHandler)(void));/****** 函数介绍 ******/
/* 作用 UART中断函数注册* 传入参数 * ui32Base UART端口的基地址* void (*pfnHandler)(void) 串口中断函数名字此函数无返回值无传入值* 返回参数 无
*/
ROM_IntPrioritySet 设置中断的优先级。 /****** 函数声明 ******/
//这个存放在ROM
void ROM_IntPrioritySet(uint32_t ui32Interrupt,uint8_t ui8Priority);
//这个是存放在flash
void IntPrioritySet(uint32_t ui32Interrupt,uint8_t ui8Priority);/****** 函数介绍 ******/
/* 作用 设置中断的优先级* 传入参数 * ui32Interrupt 指定所涉及的中断。在hw_ints.h中定义* ui8Priority 中断优先级当同时断言多个中断时具有最高优先级的中断将在较低优先级的中断之前被处理。xxx0 0000只看 xxx 前三位。比如0的优先级比0xE0高。* 返回参数 无
*/
printf重映射 1因为很多人喜欢使用printf重映射打印数据。所以这里我也进行简单的讲解。但是printf重映射只能映射一个串口不过我下面还有一个方案可以让所有的串口都能够printf重映射。 2我们只需要将x改动一下即可。同时需要打开MicroLIB。 //重新映射printf函数到UARTxx可为1,2,3,4,5,6,7
int fputc(int ch, FILE *f){UARTCharPut(UARTx_BASE,ch); return (ch);}
int fgetc(FILE *f) {int chUARTCharGet(UARTx_BASE); return (ch);}printf(* 作者 : CSND 风正豪 \r\n);多个串口同时重映射 直接复制如下的函数就可以直接将多个串口初始 /* 作用 用于多路串口重定义* 传入参数 baseAddress 要打印的串口地址UARTx_BASEx可为01234567format 需要打印的东西... 如果是打印字符输入%c。有符号数字%d。用法与printf一样* 返回值 无
*/
void UART_printf(uint32_t baseAddress, const char *format,...)
{uint32_t length;va_list args;uint32_t i;char TxBuffer[128] {0};va_start(args, format);length vsnprintf((char*)TxBuffer, sizeof(TxBuffer), (char*)format, args);va_end(args);for(i 0; i length; i){while(UARTBusy(baseAddress));UARTCharPut(baseAddress,TxBuffer[i]);}
}实操
#include stdio.h
#include stdint.h
#include stdbool.h
#include string.h
#include stdarg.h
#include hw_memmap.h
#include hw_types.h
#include hw_gpio.h
#include hw_ints.h
#include debug.h
#include fpu.h
#include gpio.h
#include pin_map.h
#include rom.h
#include sysctl.h
#include uart.h
#include uartstdio.h#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif/*
*********************************************************************************************************
* 函 数 名: PrintfLogo
* 功能说明: 打印例程名称和例程发布日期, 接上串口线后打开PC机的串口终端软件可以观察结果
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void PrintfLogo(void)
{printf(*************************************************************\n\r);printf(* %s\r\n, 串口0控制RGB例程); /* 打印例程名称 */printf(* 发布日期 : %s\r\n, 2023年4月24日); /* 打印例程日期 */printf(* 使用芯片 : TM4C123GH6PZI7\r\n);printf(* 作者 : CSND 风正豪 \r\n);printf(*************************************************************\n\r);
}
/* 作用 用于多路串口重定义* 传入参数 baseAddress 要打印的串口地址UARTx_BASEx可为01234567format 需要打印的东西... 如果是打印字符输入%c。有符号数字%d。用法与printf一样* 返回值 无
*/
void UART_printf(uint32_t baseAddress, const char *format,...)
{uint32_t length;va_list args;uint32_t i;char TxBuffer[128] {0};va_start(args, format);length vsnprintf((char*)TxBuffer, sizeof(TxBuffer), (char*)format, args);va_end(args);for(i 0; i length; i){while(UARTBusy(baseAddress));UARTCharPut(baseAddress,TxBuffer[i]);}
}//串口0的接收中断
static uint8_t ch;
void UART0_IRQHandler(void)
{ //获取中断标志 原始中断状态 屏蔽中断标志 uint32_t flag UARTIntStatus(UART0_BASE,1);//清除中断标志 UARTIntClear(UART0_BASE,flag);//判断FIFO是否还有数据while(UARTCharsAvail(UART0_BASE)) { //接收数据chUARTCharGet(UART0_BASE);}
}void ConfigureUART0(void)
{ //使能UART使用的GPIO外设 ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能 UART0ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//配置UART模式的GPIO引脚ROM_GPIOPinConfigure(GPIO_PA0_U0RX);ROM_GPIOPinConfigure(GPIO_PA1_U0TX);ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);//设置串口0时钟源速率为系统时钟波特率为96008数据位1停止位无校验位UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));//禁用UART模块的FIFO缓冲区。减少串口接收的延迟提高响应速度。UARTFIFODisable(UART0_BASE);//使能UART0接收中断 UARTIntEnable(UART0_BASE,UART_INT_RX);//UART0中断函数注册 UARTIntRegister(UART0_BASE,UART0_IRQHandler);//设置中断优先级ROM_IntPrioritySet(INT_UART0,0x60);
}//重新映射printf函数到UART0
int fputc(int ch, FILE *f){UARTCharPut(UART0_BASE,ch); return (ch);}
int fgetc(FILE *f) {int chUARTCharGet(UART0_BASE); return (ch);}void RGB_Init(void)
{ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //使能GPIOF外设 ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_5);//红色ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_6);//绿色ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4);//蓝色ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);//置高位熄灭ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_5, GPIO_PIN_5);//置高位熄灭ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_6, GPIO_PIN_6);//置高位熄灭
}int main(void)
{ROM_FPUEnable();//使能浮点单元。这个函数必须在执行任何硬件浮点运算之前被调用;如果不这样做将导致NOCP使用错误。ROM_FPULazyStackingEnable();//浮点延迟堆栈,减少中断响应延迟 ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);//配置系统时钟系统时钟频率400M/2/2.580MRGB_Init();ConfigureUART0();//初始化串口0PrintfLogo();//串口打印版本信息while(1){if((int8_t)ch a){UARTprintf(Turn on the LED1\n); //无法使用UART_printf(UART0_BASE,%s\n,hello world);GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_5, !GPIO_PIN_5);//置低位点亮SysCtlDelay(SysCtlClockGet() / 10); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_5, GPIO_PIN_5);//置高位熄灭SysCtlDelay(SysCtlClockGet() / 10);}if((int8_t)ch b){UART_printf(UART0_BASE,22%d\n,4);GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_6, !GPIO_PIN_6);//置低位点亮SysCtlDelay(SysCtlClockGet() / 10); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_6, GPIO_PIN_6);//置高位熄灭SysCtlDelay(SysCtlClockGet() / 10);}if((int8_t)ch c){UART_printf(UART0_BASE,22.0%f\n,4.0);GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, !GPIO_PIN_4);//置低位点亮SysCtlDelay(SysCtlClockGet() / 10); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);//置高位熄灭SysCtlDelay(SysCtlClockGet() / 10);}}
}