中断和使用 UART
Interrupting and using UART
我正在为一个项目苦苦挣扎,所以,我来了。
我的问题是通过 UART 发送数据。事实上,这不是问题,因为我成功发送数据感谢:
int x=1;
#define var 00000001
void InitUART()
{
mPORTFClearBits(BIT_8);
TRISFbits.TRISF8=0; // RF8 output==>TX1
TRISFbits.TRISF1=1; // RF1 input==>RX1
U1STA = 0x1400; // Enable Tx(inv) and Rx
//U1BRG = 8332; // value = (80000000 / BAUD) - 1 = 9600
U1MODE = 0x8008; // Enable UART with 1 stop bit, no parity and BRGH
OpenUART1(UART_EN | UART_BRGH_FOUR, UART_RX_ENABLE | UART_TX_ENABLE,U1BRG(UART1_BAUD) );
}
int main(void) {
InitUART;
while (1)
{
x|=var;
x=x<<1; //=> 0000 0010
x=x<<1; //=> 0000 0101
x|=var;
x=x<<1; //=> 0000 1011
x|=var;
x=x<<1; //=> 0001 0110
x=x<<1; //=> 0010 1101
x|=var;
x=x<<1; //=> 0101 1010
x=x<<1; //=> 1011 0100
//uart_send_data((BYTE*)x,8);
U1TXREG=x;
}
而且我收到的很好。
但是,我想使用 ChangeNotice 中断。这是代码,它有效:
void InitISR()
{
SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
PORTSetPinsDigitalIn(IOPORT_B, BIT_2); //RB2 as input for CN4 operation
mPORTBClearBits(BIT_2);
mCNOpen(CONFIG, PINS, PULLUPS);
// mCNClearIntFlag(); // clear interrupt flag
temp=mPORTBRead(); // clear port mismatch
ConfigIntCN(INTERRUPT); // enable CN interrupt
INTEnableSystemMultiVectoredInt();
TRISEbits.TRISE0= 1; //E0 input // SCL EST BRANCHE EN E0/D0
TRISEbits.TRISE1= 1; //E1 input // SDA EST BRANCHE EN E1/D1
TRISEbits.TRISE2= 0; //D2 output
TRISEbits.TRISE3=0;
LATEbits.LATE2=0;
LATEbits.LATE3=0;
}
void __ISR(_CHANGE_NOTICE_VECTOR,ipl6) ChangeNotification_Handler(void)
{
LATEbits.LATE2=0; //To know
LATEbits.LATE2=1; // that interrupt
LATEbits.LATE2=0; // is working
if ((mPORTEReadBits(BIT_0))!=0) //Check if clock is high==> sending data
{
nbr++;
SDA=mPORTEReadBits(BIT_1);
if (SDA==0) // data =0?
{
i=i<<1;
}
else // data !=0 ==> 1
{
i=i<<1;
i|=var;
} }
else
{
if (nbr==8) // 8bits=>1byte
{
U1TXREG = i;
nbr=0;
}
else
{
}
}
temp=mPORTBReadBits(BIT_2);
mCNClearIntFlag();
}
但是,当我同时执行这两项操作时,它正在发送一些东西,但根本不是我要找的东西,它正在发送(六进制)000 224 224 000 224 224 00 224 224 000。而不是接收每个字节一个字节,我每 14 个字节接收 14 个字节。
所以,我虽然 UART 带来了中断,但我尝试使用 asm("di");
或 IEC0bits.U1TXIE=0;
或 IEC0bits.U1TXIE=0;
禁用它但没有任何效果......
所以,如果有人知道我为什么有这个问题,我会很高兴=D
干杯。
所以,有一天我会把它发给可能有同样问题的人。
问题只是时钟。即使你有一个特殊的石英,你也需要定义你的系统时钟。并且,当您设置系统时钟时,您必须定义您的外设时钟,是的另一个。但要小心,我认为并非所有外设引脚都在外设时钟上工作。
所以,我有一个 48Mhz 石英,我的代码在这里:
//48Mhz
//I want SYS_CLOKC=40Mhz
#pragma config UPLLEN = OFF // USB PLL Enabled, OFF si quartz 48 MHz
#pragma config FPLLIDIV = DIV_12 // PLL Input Divider, il faut obtenir
// entre 4 et 5 MHz
#pragma config FPLLMUL = MUL_20 // PLL Multiplier
#pragma config FPLLODIV = DIV_2 // PLL Output Divider
// périphérique clock 5Mhz = SYSCLK/FPBDIV
#pragma config FPBDIV = DIV_8 // Peripheral Clock divisor
// oscillateur : Primary Osc w/PLL (XT+,HS+,EC+PLL)
#pragma config POSCMOD = HS // Primary Oscillator
#pragma config FNOSC = PRIPLL // Oscillator Selection
#pragma config FWDTEN = OFF // Watchdog Timer
#pragma config CP = OFF // Code Protect
48/12=4Mhz
4*20=80Mhz
80/2=40Mhz System_CLOCK=40Mhz
40/8=5Mz 外围时钟=5Mhz
对于其余的代码,我无法向您解释,我找到了整个块并且它是这样工作的所以...
我正在为一个项目苦苦挣扎,所以,我来了。
我的问题是通过 UART 发送数据。事实上,这不是问题,因为我成功发送数据感谢:
int x=1;
#define var 00000001
void InitUART()
{
mPORTFClearBits(BIT_8);
TRISFbits.TRISF8=0; // RF8 output==>TX1
TRISFbits.TRISF1=1; // RF1 input==>RX1
U1STA = 0x1400; // Enable Tx(inv) and Rx
//U1BRG = 8332; // value = (80000000 / BAUD) - 1 = 9600
U1MODE = 0x8008; // Enable UART with 1 stop bit, no parity and BRGH
OpenUART1(UART_EN | UART_BRGH_FOUR, UART_RX_ENABLE | UART_TX_ENABLE,U1BRG(UART1_BAUD) );
}
int main(void) {
InitUART;
while (1)
{
x|=var;
x=x<<1; //=> 0000 0010
x=x<<1; //=> 0000 0101
x|=var;
x=x<<1; //=> 0000 1011
x|=var;
x=x<<1; //=> 0001 0110
x=x<<1; //=> 0010 1101
x|=var;
x=x<<1; //=> 0101 1010
x=x<<1; //=> 1011 0100
//uart_send_data((BYTE*)x,8);
U1TXREG=x;
}
而且我收到的很好。
但是,我想使用 ChangeNotice 中断。这是代码,它有效:
void InitISR()
{
SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
PORTSetPinsDigitalIn(IOPORT_B, BIT_2); //RB2 as input for CN4 operation
mPORTBClearBits(BIT_2);
mCNOpen(CONFIG, PINS, PULLUPS);
// mCNClearIntFlag(); // clear interrupt flag
temp=mPORTBRead(); // clear port mismatch
ConfigIntCN(INTERRUPT); // enable CN interrupt
INTEnableSystemMultiVectoredInt();
TRISEbits.TRISE0= 1; //E0 input // SCL EST BRANCHE EN E0/D0
TRISEbits.TRISE1= 1; //E1 input // SDA EST BRANCHE EN E1/D1
TRISEbits.TRISE2= 0; //D2 output
TRISEbits.TRISE3=0;
LATEbits.LATE2=0;
LATEbits.LATE3=0;
}
void __ISR(_CHANGE_NOTICE_VECTOR,ipl6) ChangeNotification_Handler(void)
{
LATEbits.LATE2=0; //To know
LATEbits.LATE2=1; // that interrupt
LATEbits.LATE2=0; // is working
if ((mPORTEReadBits(BIT_0))!=0) //Check if clock is high==> sending data
{
nbr++;
SDA=mPORTEReadBits(BIT_1);
if (SDA==0) // data =0?
{
i=i<<1;
}
else // data !=0 ==> 1
{
i=i<<1;
i|=var;
} }
else
{
if (nbr==8) // 8bits=>1byte
{
U1TXREG = i;
nbr=0;
}
else
{
}
}
temp=mPORTBReadBits(BIT_2);
mCNClearIntFlag();
}
但是,当我同时执行这两项操作时,它正在发送一些东西,但根本不是我要找的东西,它正在发送(六进制)000 224 224 000 224 224 00 224 224 000。而不是接收每个字节一个字节,我每 14 个字节接收 14 个字节。
所以,我虽然 UART 带来了中断,但我尝试使用 asm("di");
或 IEC0bits.U1TXIE=0;
或 IEC0bits.U1TXIE=0;
禁用它但没有任何效果......
所以,如果有人知道我为什么有这个问题,我会很高兴=D
干杯。
所以,有一天我会把它发给可能有同样问题的人。 问题只是时钟。即使你有一个特殊的石英,你也需要定义你的系统时钟。并且,当您设置系统时钟时,您必须定义您的外设时钟,是的另一个。但要小心,我认为并非所有外设引脚都在外设时钟上工作。
所以,我有一个 48Mhz 石英,我的代码在这里:
//48Mhz
//I want SYS_CLOKC=40Mhz
#pragma config UPLLEN = OFF // USB PLL Enabled, OFF si quartz 48 MHz
#pragma config FPLLIDIV = DIV_12 // PLL Input Divider, il faut obtenir
// entre 4 et 5 MHz
#pragma config FPLLMUL = MUL_20 // PLL Multiplier
#pragma config FPLLODIV = DIV_2 // PLL Output Divider
// périphérique clock 5Mhz = SYSCLK/FPBDIV
#pragma config FPBDIV = DIV_8 // Peripheral Clock divisor
// oscillateur : Primary Osc w/PLL (XT+,HS+,EC+PLL)
#pragma config POSCMOD = HS // Primary Oscillator
#pragma config FNOSC = PRIPLL // Oscillator Selection
#pragma config FWDTEN = OFF // Watchdog Timer
#pragma config CP = OFF // Code Protect
48/12=4Mhz
4*20=80Mhz
80/2=40Mhz System_CLOCK=40Mhz
40/8=5Mz 外围时钟=5Mhz
对于其余的代码,我无法向您解释,我找到了整个块并且它是这样工作的所以...