单片机 TM4C123GXL,芯片GH6PM
CCS 版本6.0.1
程序设置两个定时器中断使能PB6和PB4,PB6输出正常,但PB4无输出,示波器观察PB4峰值只有40mv,当我把程序里的PB4换成其他口,输出就正常了。是PB4
端口已经坏了还是其他的问题?附程序如下:
#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"
uint8_t count0=0;
uint8_t count1=0;
int main(void)
{
uint32_t ui32Period0, ui32Period1;
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
TimerConfigure(TIMER1_BASE, TIMER_CFG_PERIODIC);
ui32Period0 = (SysCtlClockGet() / 220) / 10;
ui32Period1 = (SysCtlClockGet() / 260) / 10;
TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period0 -1);
TimerLoadSet(TIMER1_BASE, TIMER_A, ui32Period1 -1);
IntEnable(INT_TIMER0A);
IntEnable(INT_TIMER1A);
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
IntMasterEnable();
TimerEnable(TIMER0_BASE, TIMER_A);
TimerEnable(TIMER1_BASE, TIMER_A);
while(1)
{
}
}
void Timer0IntHandler(void)
{
// Clear the timer interrupt
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
if(count0 == 20)
{
count0 = 0;
}
// Read the current state of the GPIO pin and
// write back the opposite state
if((count0 == 0)||(count0 == 10)||(count0 == 11)||(count0 == 12)||(count0 == 13)||(count0 == 14))
{
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_6, 64);
}
else
{
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_6, 0);
}
count0++;
}
void Timer1IntHandler(void)
{
// Clear the timer interrupt
TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
if(count1 == 20)
{
count1 = 0;
}
// Read the current state of the GPIO pin and
// write back the opposite state
if((count1 == 0)||(count1 == 1)||(count1 == 2)||(count1 == 3)||(count1 == 4)||(count1 == 10))
{
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_4, 16);
}
else
{
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_4, 0);
}
count1++;
}
Maka Luo:
这个是我写的一个测试程序,经验证是PB4可以正常翻转。
可以到你的板子上测试一下。如果无法输出可能是硬件的问题.
intmain(void){
// // Enable lazy stacking for interrupt handlers. This allows floating-point // instructions to be used within interrupt handlers, but at the expense of // extra stack usage. // ROM_FPULazyStackingEnable();
// // Set the clocking to run directly from the crystal. // ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
// // Enable the peripherals used by this application. //
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlDelay(10);//模块时钟使能需要等待6个cycle以上 ROM_GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_4); ROM_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_4,GPIO_PIN_4);
// while(1) { ROM_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_4, GPIO_PIN_4); SysCtlDelay(5000); ROM_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_4, 0); SysCtlDelay(5000); }}
qifan gao:
回复 Maka Luo:
您好,示波器上有翻转,但是输出只有36mv。
我之前的和您的结果一样
Maka Luo:
回复 qifan gao:
首先 我测试GPIO输出电压是正常的,3.3V。
你跑了我那个代码也是一样的结果吗?会不会你外部硬件问题,导致GPIO输出高的时候被强制拉低了?
qifan gao:
回复 Maka Luo:
您好,只有PB4口输出平均值是331mv,峰峰值是36mv,其余口都是3.3V
板子外部我也没有做什么改变。
Maka Luo:
回复 qifan gao:
断电后测试一下此GPIO口对地电阻是多少,和正常的GPIO口对比一下。
应该是你硬件的问题,是个PB4口对地下拉了小电阻。
如果GPIO烧坏,那么输出波形就会有问题。
qifan gao:
回复 Maka Luo:
您好,对地电阻是6.53M欧,比其他的口小一些
他的输出波形是这样子的:
Maka Luo:
回复 qifan gao:
有M欧级别,说明没有问题。
示波器测试其它电压看看,确认一下示波器是否设置正常?
qifan gao:
回复 Maka Luo:
您好,示波器设置没有问题。
那我初始化出厂设置后,为什么PB4口还是比其他的口电阻都要小呢?
Maka Luo:
回复 qifan gao:
建议换个板子测试一下,我这边测试没有问题。
不排除这个GPIO损伤了。
qifan gao:
回复 Maka Luo:
好的,谢谢,请问有什么样的原因会使端口出这样的问题呢?