我已经编写了一个代码、以5秒的间隔生成100ms 的脉冲、如果我在 Systic 计时器中加载100ms 的值不会产生正确的结果、但如果我在加载寄存器中插入50的值、则会生成精确的脉冲。据我所知、在以80MHz 的 systic 工作时、 我们可以 每200ms 获得一次中断(最大计数时,计时器每200ms 溢出一次)。当100被放入此命令时(ROM_SysTickPeriodSet (SysCtlClockGet ()*100/1000);),我无法获得正确的值,但如果我放置50,我得到的结果是50ms 脉冲。 以下是代码。
/*************
这是用于监控 Pi 状态的主要程序应用程序
PPD0引脚接收来自 Pi 的状态。 每次切换时、
状态会更新、并由 LED 显示。 有4种状态:
第一个状态表示 PI 最近是否重新启动、
其中其他3个引脚显示 PI 状态。 PI 的当前状态、
由相应 LED 的参考文献表示
它利用 TM4C123G 的 WTimer0来实现内部时序。
如果程序在60秒内未从 PI 接收到任何状态、
程序将重新初始化。
系统还会在 GPS 的帮助下每秒获得更新时间。
它连接到 UART1、NMEA 语句通过存储在环形缓冲器中
UART 中断。 当句子时、通过数据解析提取时间信息
终止。
它会生成自己的脉冲、以告知 PI 何时传输数据。 它会自动同步
每30分钟使用 GPS 的 PPS 以消除计时器漂移。 使用 WTimer 1
要监控重新同步超时、使用计时器1将脉冲设置为零
连接:
PD0 -> Pi 状态切换引脚
PB1 -> LED1 (表示 Pi 最近是否重新启动)
PB2 -> LED2
Pb3 -> LED3
PB4 -> LED4
GND -> Pi 接地
PC4 (U1RX)-> GPS TX
PC6 -> GPS PPS
PC7 -> PI GPIO 引脚(指示 PI 启动传输)
3.3V -> GPS VIN 引脚
GND -> GPS GND
秘书长的报告 /
#include
#include
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
//#include "utils/uartstdio.c"
//void PWMint();
#include
//#include "strfunc.h"
#include "inc/hw_ints.h"
#include "inc/hw_timer.h"
#include "inc/hw_gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.c"
#include "driverlib/sysctl.h"
#include "driverlib/Timer.c"
#include "driverlib/Timer.h"
#include "driverlib/gpio.c"
#include "driverlib/gpio.h"
#include "adafruitUltimateGPS.h"
#include
#include "UART.h"
//#include "SysTickInts.h"
//#include "pll.h"
bool isDeviceIDSyncPrepTime (char* currTimeString、uint8_t currDeviceID);
bool PPSInterruptOccaled=false;//bool 变量、用于存储重新同步请求后是否发生 pps 中断
bool ResyncTimeout=false;//flag、用于说明是否发生了与 PPS 重新同步的超时
bool PPSTimerEnabled=false;//flag、用于存储是否启用 PPS 计时器
uint32_t lastSyncWithPPS = 0;//变量用于存储上次与 PPS 重新同步后经过的时间
int programState=0;//
const uint8_t device_id=1;//设备 ID
int i=0;
int T_count=0;
int ResyncTime=720+1;
uint32_t g_ui32Flags;
//
//
//驱动程序库遇到错误时调用的错误例程。
//
//
//
//
//配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。
//
//
无效
配置 UART (空)
{
//
//启用用于 UART0引脚的 GPIO 端口 A。
// TODO:将其更改为您正在使用的 GPIO 端口。
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//
//为端口 A0和 A1上的 UART0功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
//
//启用 UART0以便我们可以配置时钟。
//
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//
//使用内部16MHz 振荡器作为 UART 时钟源。
//
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
//
//为这些引脚选择替代(UART)功能。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
//
//初始化控制台 I/O 的 UART
//
UARTStdioConfig (0、115200、16000000);
}
void configPiStatusGPIO()
{
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
//LED
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_2);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0x00);
}
int 计数器、i、j=0;
void configPPSGPIO()
{
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);//启用 PORTC 外设
GPIOPinTypeGPIOInput (GPIO_PORTC_BASE、GPIO_PIN_6);//将端口 C 引脚6设置为输入类型
GPIOIntTypeSet (GPIO_PORTC_BASE、GPIO_PIN_6、GPIO_RISING _EDGE);//将 int 设置为上升沿(将在从低电平到高电平的变化时调用)
GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_7);//将端口 C 引脚7设置为输出类型
GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_7、0x00);//将0写入 PC7
}
空 configPPSTIME()
{
ROM_SysTickPeriodSet (SysCtlClockGet ()*100/1000);// 1ms 周期
ROM_IntMasterEnable();
ROM_SysTickIntEnable();
}
void synsynsynsWithGPSPPS()
{
UARTprintf ("正在等待来自 GPS\r\n 的 PPS);
GPIOIntClear (GPIO_PORTC_BASE、GPIO_INT_PIN_6);//清除中断
ROM_IntEnable (INT_GPIOC);
GPIOIntEnable (GPIO_PORTC_BASE、GPIO_PIN_6);//启用中断
}
空 PPSGPIOInterrupt()
{
GPIOIntClear (GPIO_PORTC_BASE、GPIO_INT_PIN_6);//清除中断
ROM_SysTickPeriodSet (SysCtlClockGet ()*100/1000);//如果我在这里放置100,我不会得到正确的时间周期,我会得到44ms 的时间周期
;
ROM_IntMasterEnable();
ROM_SysTickIntEnable();
ROM_SysTickEnable();
UARTprintf ("\r\nShifting to State 2");
programState = 2;
计数器=0;
T_count=0;
ROM_IntDisable (INT_GPIOC);
GPIOIntDisable (GPIO_PORTC_BASE、GPIO_PIN_6);//禁用中断
//lastSyncWithPPS = 0;
UARTprintf ("PPS 已发生且控制器已同步\r\n);
}
空 TickHandler()
{
// if (counter>1){
GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_7、0x00);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0x00);
//}
计数器=计数器+1;
if (counter=100){
GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_7、0xFF);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0xFF);
计数器=0;
T_count=T_count+1;
UARTprintf ("高脉冲=%i\n"、T_count);
}
}
int main (空)
{
SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
ROM_FPULazyStackingEnable();
//configWatchdog();//initialize watchdog -要进行测试,请将其注释
ConfigureUART();//初始化应用程序使用的 UART
//UART_Init();
initgps();
initStreamer();
UARTprintf ("initialized\r\n");
//
configPiStatusGPIO();
//configPiStatusTimer();
configPPSGPIO();
configPPSTIME();
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);// PF1-3作为输出
programState=1;
while (1)
{
//UARTprintf ("d");
switch (programState)
{
情况0:
{
if (isGPSSentenceComplete())
{
UARTprintf ("\r\nShifting to State 1");
GPSGetData();
if (isGPSDataUpdated())
{
UARTprintf ("\r\nShifting to State 1");
if (isDeviceIDSyncPrepTime ((char*) GPSData->time、device_id)=true)
{
UARTprintf (GPSData->Time);
UARTprintf ("\r\n");
UARTprintf ("\r\nShifting to State 1");
programState = 1;
UARTprintf ("\r\n");
}
}
}
中断;
}
案例1:
{
syncGPSPPS();
中断;
}
案例2:
{
if (T_count=ResyncTime){
UARTprintf ("Resynctimeout=true");
ROM_SysTickDisable();
programState = 1;
}
中断;
}
默认值:
{
UARTprintf ("卡在错误的程序状态...\r\n 重置为状态0...");
programState = 0;
}
}
}
}
bool isDeviceIDSyncPrepTime (char* currTimeString、uint8_t currDeviceID)
{
char d_id[4];
strcpy (d_id、"1.000");
UARTprintf ("\r\nDevice ID:");
UARTprintf (d_id);
UARTprintf ("\r\nDevice Time:");
UARTprintf (&currTimeString[5]);
if (strncmp (&currTimeString[5]、"1.000"、3)=0 || strncmp (&currTimeString[5]、"6.000"、3)=0){
UARTprintf ("\r\n 触发时间:");
UARTprintf (&currTimeString[5]);
返回 true;
}
否则{
返回 false;
}
}