TI中文支持网
TI专业的中文技术问题搜集分享网站

TM4C123GXL 使能输出GPIOB 4端口无输出

单片机 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:

好的,谢谢,请问有什么样的原因会使端口出这样的问题呢?

赞(0)
未经允许不得转载:TI中文支持网 » TM4C123GXL 使能输出GPIOB 4端口无输出
分享到: 更多 (0)