基于TM4C123GH6PM芯片的智能家居控制系统实验设计与实现
#include "tm4c123gh6pm.h"
void init_GPIO(void); void init_UART(void); void init_Timer(void); void UART_OutChar(char data);
int main(void) { init_GPIO(); init_UART(); init_Timer(); while (1) { if (!(GPIO_PORTF_DATA_R & 0x10)) { // 检测PF4按键是否按下 GPIO_PORTF_DATA_R ^= 0x02; // 切换PF1 LED灯的开关状态 while (!(GPIO_PORTF_DATA_R & 0x10)); // 等待按键松开 } } }
void init_GPIO(void) { SYSCTL_RCGCGPIO_R |= 0x20; // 使能GPIOF时钟 while (!(SYSCTL_PRGPIO_R & 0x20)); // 等待GPIOF时钟稳定 GPIO_PORTF_LOCK_R = 0x4C4F434B; // 解锁GPIOF的CR寄存器 GPIO_PORTF_CR_R |= 0x1F; // 允许GPIOF的所有引脚被配置 GPIO_PORTF_DIR_R |= 0x02; // 设置PF1引脚为输出引脚 GPIO_PORTF_DEN_R |= 0x1F; // 允许GPIOF的所有引脚被数字模式控制 GPIO_PORTF_PUR_R |= 0x10; // 使能PF4引脚上拉电阻 }
void init_UART(void) { SYSCTL_RCGCUART_R |= 0x01; // 使能UART0时钟 SYSCTL_RCGCGPIO_R |= 0x01; // 使能GPIOA时钟 while (!(SYSCTL_PRGPIO_R & 0x01)); // 等待GPIOA时钟稳定 GPIO_PORTA_AFSEL_R |= 0x03; // 使能PA0和PA1引脚的UART功能 GPIO_PORTA_PCTL_R |= 0x11; // 配置PA0和PA1引脚的UART功能 GPIO_PORTA_DEN_R |= 0x03; // 允许PA0和PA1引脚被数字模式控制 UART0_CTL_R &= ~0x01; // 禁用UART0模块 UART0_IBRD_R = 104; // 设置波特率为9600 UART0_FBRD_R = 11; UART0_LCRH_R = 0x70; // 设置UART0模块为8位数据位、1位停止位、无奇偶校验位 UART0_CTL_R |= 0x301; // 使能UART0模块、接收和发送功能 }
void init_Timer(void) { SYSCTL_RCGCTIMER_R |= 0x01; // 使能Timer0时钟 while (!(SYSCTL_PRTIMER_R & 0x01)); // 等待Timer0时钟稳定 TIMER0_CTL_R &= ~0x01; // 禁用Timer0模块 TIMER0_CFG_R = 0x04; // 设置Timer0模块为32位定时器模式 TIMER0_TAMR_R = 0x02; // 设置Timer0模块为周期计数模式 TIMER0_TAILR_R = 16000000; // 设置Timer0模块的计数器周期为1s TIMER0_IMR_R |= 0x01; // 使能Timer0模块的定时器中断 NVIC_EN0_R |= 0x00080000; // 使能Timer0模块的中断 TIMER0_CTL_R |= 0x01; // 启用Timer0模块 }
void UART_OutChar(char data) { while ((UART0_FR_R & 0x20)); // 等待UART0模块的发送缓冲区为空 UART0_DR_R = data; // 发送字符 }
void Timer0_Handler(void) { if (TIMER0_RIS_R & 0x01) { // 检测Timer0模块是否产生定时器中断 TIMER0_ICR_R |= 0x01; // 清除Timer0模块的定时器中断标志位 GPIO_PORTF_DATA_R ^= 0x04; // 切换PF2 LED灯的开关状态 UART_OutChar('L'); // 发送字符'L' }
原文地址: https://www.cveoy.top/t/topic/oBWK 著作权归作者所有。请勿转载和采集!