Re: UART interrupt based on MCF52235
"Ricardo Raupp" <[email protected]> Tue, 3 Jun 2008 08:55:29 -0300
| Newsgroups | gmane.comp.hardware.motorola.microcontrollers.coldfire |
|---|---|
| Message-ID | <001301c8c570$b82aa270$c705050a@ricardo> |
Sanjay
Don´t forget to configure the Interrupt Controller, besides the uart
registers.
Interrupt Controller will allow your uart block be served by a interrupt
function, I mean, only uart registers configiratiion is not enough to
generate inetrrupt, either rx or tx one.
I suggest you use CF Init to start with it ...
Follow below my Interrupt Controller initialization (generated by CF Init).
I hope this helps...good luck !!!
Ricardo Raupp
/* Configured interrupt sources in order of priority...
Level 7: Software watchdog timeout
External interrupt /IRQ7, (initially masked)
Level 6: External interrupt /IRQ6, (initially masked)
Level 5: Ethernet receive frame interrupt
External interrupt /IRQ5, (initially masked)
Level 4: External interrupt /IRQ4, (initially masked)
Level 3: External interrupt /IRQ3, (initially masked)
Level 2: UART1 interrupt
External interrupt /IRQ2, (initially masked)
PIT 0 interrupt
Level 1: UART0 interrupt
External interrupt /IRQ1, (initially masked)
*/
MCF_INTC0_ICR1 = 0;
MCF_INTC0_ICR2 = 0;
MCF_INTC0_ICR3 = 0;
MCF_INTC0_ICR4 = 0;
MCF_INTC0_ICR5 = 0;
MCF_INTC0_ICR6 = 0;
MCF_INTC0_ICR7 = 0;
MCF_INTC0_ICR8 = MCF_INTC_ICR_IL(0x7) |
MCF_INTC_ICR_IP(0x5);
MCF_INTC0_ICR9 = 0;
MCF_INTC0_ICR10 = 0;
MCF_INTC0_ICR11 = 0;
MCF_INTC0_ICR12 = 0;
MCF_INTC0_ICR13 = MCF_INTC_ICR_IL(0x1) |
MCF_INTC_ICR_IP(0x6);
MCF_INTC0_ICR14 = MCF_INTC_ICR_IL(0x2) |
MCF_INTC_ICR_IP(0x5);
MCF_INTC0_ICR15 = 0;
MCF_INTC0_ICR17 = 0;
MCF_INTC0_ICR18 = 0;
MCF_INTC0_ICR19 = 0;
MCF_INTC0_ICR20 = 0;
MCF_INTC0_ICR21 = 0;
MCF_INTC0_ICR22 = 0;
MCF_INTC0_ICR23 = 0;
MCF_INTC0_ICR24 = 0;
MCF_INTC0_ICR25 = 0;
MCF_INTC0_ICR26 = 0;
MCF_INTC0_ICR27 = MCF_INTC_ICR_IL(0x5) |
MCF_INTC_ICR_IP(0x7);
MCF_INTC0_ICR28 = 0;
MCF_INTC0_ICR29 = 0;
MCF_INTC0_ICR30 = 0;
MCF_INTC0_ICR31 = 0;
MCF_INTC0_ICR32 = 0;
MCF_INTC0_ICR33 = 0;
MCF_INTC0_ICR34 = 0;
MCF_INTC0_ICR35 = 0;
MCF_INTC0_ICR36 = 0;
MCF_INTC0_ICR41 = 0;
MCF_INTC0_ICR42 = 0;
MCF_INTC0_ICR43 = 0;
MCF_INTC0_ICR44 = 0;
MCF_INTC0_ICR45 = 0;
MCF_INTC0_ICR46 = 0;
MCF_INTC0_ICR47 = 0;
MCF_INTC0_ICR48 = 0;
MCF_INTC0_ICR49 = 0;
MCF_INTC0_ICR50 = 0;
MCF_INTC0_ICR51 = 0;
MCF_INTC0_ICR52 = 0;
MCF_INTC0_ICR55 = MCF_INTC_ICR_IL(0x2) |
MCF_INTC_ICR_IP(0x2);
MCF_INTC0_ICR56 = 0;
MCF_INTC0_ICR59 = 0;
MCF_INTC0_ICR60 = 0;
MCF_INTC0_ICR61 = 0;
MCF_INTC0_ICR62 = 0;
MCF_INTC0_ICR63 = 0;
MCF_INTC1_ICR32 = 0;
MCF_INTC1_ICR33 = 0;
MCF_INTC1_ICR34 = 0;
MCF_INTC1_ICR35 = 0;
MCF_INTC1_ICR36 = 0;
MCF_INTC1_ICR37 = 0;
MCF_INTC1_ICR38 = 0;
MCF_INTC1_ICR39 = 0;
MCF_INTC0_IMRH = MCF_INTC_IMRH_MASK63 |
MCF_INTC_IMRH_MASK62 |
MCF_INTC_IMRH_MASK61 |
MCF_INTC_IMRH_MASK60 |
MCF_INTC_IMRH_MASK59 |
MCF_INTC_IMRH_MASK58 |
MCF_INTC_IMRH_MASK57 |
MCF_INTC_IMRH_MASK56 |
MCF_INTC_IMRH_MASK54 |
MCF_INTC_IMRH_MASK53 |
MCF_INTC_IMRH_MASK52 |
MCF_INTC_IMRH_MASK51 |
MCF_INTC_IMRH_MASK50 |
MCF_INTC_IMRH_MASK49 |
MCF_INTC_IMRH_MASK48 |
MCF_INTC_IMRH_MASK47 |
MCF_INTC_IMRH_MASK46 |
MCF_INTC_IMRH_MASK45 |
MCF_INTC_IMRH_MASK44 |
MCF_INTC_IMRH_MASK43 |
MCF_INTC_IMRH_MASK42 |
MCF_INTC_IMRH_MASK41 |
MCF_INTC_IMRH_MASK40 |
MCF_INTC_IMRH_MASK39 |
MCF_INTC_IMRH_MASK38 |
MCF_INTC_IMRH_MASK37 |
MCF_INTC_IMRH_MASK35 |
MCF_INTC_IMRH_MASK34 |
MCF_INTC_IMRH_MASK33 |
MCF_INTC_IMRH_MASK32;
MCF_INTC0_IMRL = MCF_INTC_IMRL_MASK31 |
MCF_INTC_IMRL_MASK30 |
MCF_INTC_IMRL_MASK29 |
MCF_INTC_IMRL_MASK28 |
MCF_INTC_IMRL_MASK26 |
MCF_INTC_IMRL_MASK25 |
MCF_INTC_IMRL_MASK24 |
MCF_INTC_IMRL_MASK22 |
MCF_INTC_IMRL_MASK21 |
MCF_INTC_IMRL_MASK20 |
MCF_INTC_IMRL_MASK19 |
MCF_INTC_IMRL_MASK18 |
MCF_INTC_IMRL_MASK17 |
MCF_INTC_IMRL_MASK16 |
MCF_INTC_IMRL_MASK15 |
MCF_INTC_IMRL_MASK12 |
MCF_INTC_IMRL_MASK11 |
MCF_INTC_IMRL_MASK10 |
MCF_INTC_IMRL_MASK9 |
MCF_INTC_IMRL_MASK7 |
MCF_INTC_IMRL_MASK6 |
MCF_INTC_IMRL_MASK5 |
MCF_INTC_IMRL_MASK4 |
MCF_INTC_IMRL_MASK3 |
MCF_INTC_IMRL_MASK2 |
MCF_INTC_IMRL_MASK1;
MCF_INTC1_IMRH = 0xffffffff;
MCF_INTC1_IMRL = 0xfffffffe;
----- Original Message -----
From: <[email protected]>
To: "Ricardo" <[email protected]>
Cc: <[email protected]>
Sent: Monday, June 02, 2008 9:57 PM
Subject: [ColdFire] UART interrupt based on MCF52235
> Dear All
>
> I am currently using the UART polled in MCF52235. But one of the product I
> need to used interrupt based. I had done initializarion and all necessory
> changes. But still it could not genrate interrupt. I need interrupt on
> each charactor received and each charactor transmitted. Can any body help
> me on urgent basis.
>
> Below in Initilization , vetctor declarations and isrs
>
> regards
> Sanjay Morab
> ==== Initialization
>
> void uart_init(void)
> {
> /*
> * Initialize all three UARTs for serial communications
> */
>
> register uint16 ubgs;
>
> /*
> * Set Port UA to initialize URXD0/UTXD0
> */
> MCF_GPIO_PUAPAR = 0
> | MCF_GPIO_PUAPAR_RXD0_RXD0
> | MCF_GPIO_PUAPAR_TXD0_TXD0;
>
> MCF_GPIO_PUBPAR = 0
> | MCF_GPIO_PUBPAR_RXD1_RXD1
> | MCF_GPIO_PUBPAR_TXD1_TXD1
> | MCF_GPIO_PUBPAR_RTS1_GPIO; // Set GPIO for RTS1
>
> MCF_GPIO_PUCPAR = 0
> | MCF_GPIO_PUCPAR_RXD2_RXD2
> | MCF_GPIO_PUCPAR_TXD2_TXD2;
>
>
> MCF_GPIO_DDRUB |= MCF_GPIO_DDRUB_DDRUB2; // Set Direction out
> /*
> * Reset Transmitter
> */
> MCF_UART0_UCR = MCF_UART_UCR_RESET_TX;
> MCF_UART1_UCR = MCF_UART_UCR_RESET_TX;
> MCF_UART2_UCR = MCF_UART_UCR_RESET_TX;
>
> /*
> * Reset Receiver
> */
> MCF_UART0_UCR = MCF_UART_UCR_RESET_RX;
> MCF_UART1_UCR = MCF_UART_UCR_RESET_RX;
> MCF_UART2_UCR = MCF_UART_UCR_RESET_RX;
>
> /*
> * Reset Mode Register
> */
> MCF_UART0_UCR = MCF_UART_UCR_RESET_MR;
> MCF_UART1_UCR = MCF_UART_UCR_RESET_MR;
> MCF_UART2_UCR = MCF_UART_UCR_RESET_MR;
>
> /*
> * No parity, 8-bits per character
> */
> MCF_UART0_UMR = (0
> | MCF_UART_UMR_PM_NONE
> | MCF_UART_UMR_BC_8 );
> MCF_UART1_UMR = (0
> | MCF_UART_UMR_PM_NONE
> | MCF_UART_UMR_BC_8 );
> MCF_UART2_UMR = (0
> | MCF_UART_UMR_PM_NONE
> | MCF_UART_UMR_BC_8 );
>
> /*
> * No echo or loopback, 1 stop bit
> */
> MCF_UART0_UMR = (0
> | MCF_UART_UMR_CM_NORMAL
> | MCF_UART_UMR_SB_STOP_BITS_1);
> MCF_UART1_UMR = (0
> | MCF_UART_UMR_CM_NORMAL
> | MCF_UART_UMR_SB_STOP_BITS_1);
> MCF_UART2_UMR = (0
> | MCF_UART_UMR_CM_NORMAL
> | MCF_UART_UMR_SB_STOP_BITS_1);
>
> /*
> * Set Rx and Tx baud by SYSTEM CLOCK
> */
> MCF_UART0_UCSR = (0
> | MCF_UART_UCSR_RCS_SYS_CLK
> | MCF_UART_UCSR_TCS_SYS_CLK);
> MCF_UART1_UCSR = (0
> | MCF_UART_UCSR_RCS_SYS_CLK
> | MCF_UART_UCSR_TCS_SYS_CLK);
> MCF_UART2_UCSR = (0
> | MCF_UART_UCSR_RCS_SYS_CLK
> | MCF_UART_UCSR_TCS_SYS_CLK);
>
> /*
> * Mask all UART interrupts
> */
> MCF_UART0_UIMR = 0;
> MCF_UART1_UIMR = 0;
> MCF_UART2_UIMR = 0;
>
> /*
> * Calculate baud settings
> */
> ubgs = (uint16)((SYSTEM_CLOCK*1000000)/(UART_BAUD19200 * 32));
>
> MCF_UART0_UBG1 = (uint8)((ubgs & 0xFF00) >> 8);
> MCF_UART0_UBG2 = (uint8)(ubgs & 0x00FF);
> ubgs = (uint16)((SYSTEM_CLOCK*1000000)/(UART_BAUD19200 * 32));
> MCF_UART1_UBG1 = (uint8)((ubgs & 0xFF00) >> 8);
> MCF_UART1_UBG2 = (uint8)(ubgs & 0x00FF);
> MCF_UART2_UBG1 = (uint8)((ubgs & 0xFF00) >> 8);
> MCF_UART2_UBG2 = (uint8)(ubgs & 0x00FF);
> MCF_INTC0_ICR13 = MCF_INTC_ICR_IL(2);
> MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_MASK13;
>
> MCF_INTC0_ICR14 = MCF_INTC_ICR_IL(2);
> MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_MASK14;
>
> MCF_INTC0_ICR15 = MCF_INTC_ICR_IL(2);
> MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_MASK15;
>
>
> MCF_UART0_UIMR = ( MCF_UART_UIMR_TXRDY |
> MCF_UART_UIMR_RXRDY_FU );
>
> MCF_UART1_UIMR = ( MCF_UART_UIMR_TXRDY |
> MCF_UART_UIMR_RXRDY_FU );
> /*
> * Enable receiver and transmitter
> */
> MCF_UART0_UCR = (0
> | MCF_UART_UCR_TX_ENABLED
> | MCF_UART_UCR_RX_ENABLED);
> MCF_UART1_UCR = (0
> | MCF_UART_UCR_TX_ENABLED
> | MCF_UART_UCR_RX_ENABLED);
> MCF_UART2_UCR = (0
> | MCF_UART_UCR_TX_ENABLED
> | MCF_UART_UCR_RX_ENABLED);
>
> }
>
> ---- Vector
>
> #ifdef __GNUC__ /* { */
> #define sr %sr
> #define _irq_handler irq_handler
> #define _timer_handler timer_handler
> #define _uart0_isr uart0_isr
> #define _uart1_isr uart1_isr
> #endif /* } __GNUC__ */
>
> .global VECTOR_TABLE
> .global _VECTOR_TABLE
> .global start
>
> .extern ___SP_INIT
> .extern _asm_startmeup
> .extern _asm_exception_handler
> .extern _irq_handler
> .extern _timer_handler
> .extern _irq1_handler
> .extern _irq4_handler
> .extern _irq7_handler
> .extern _irq11_handler
> .extern _uart0_isr
> .extern _uart1_isr
> .text
> vector4D: .long _uart0_isr
> vector4E: .long _uart1_isr
>
> === ISRS
> __declspec(interrupt) void uart0_isr(void);
> __declspec(interrupt) void uart1_isr(void);
>
> void
> uart_isr(int unit)
> {
>
> int dev = unit;
> uint8 ch;
> uint8 usr;
>
>
> usr = MCF_UART_USR(dev);
> /* UART receiver */
> if (usr & MCF_UART_USR_RXRDY)
> {
> ch = MCF_UART_URB(dev);
> /* discard character if there was an error */
> if ( !(usr & (MCF_UART_USR_RB |
> MCF_UART_USR_FE |
> MCF_UART_USR_PE |
> MCF_UART_USR_OE )) )
> {
> // receiber
> }
> else
> {
> MCF_UART_UCR(dev) = MCF_UART_UCR_RESET_ERROR;
>
> }
> }
>
> /* UART transmitter */
> if (usr & MCF_UART_USR_TXRDY)
> {
>
> MCF_UART_UCR(dev) = MCF_UART_UCR_TX_ENABLED;
> ch = //xh to send
> MCF_UART_UTB(dev) = ch;
>
> }
> }
>
>
> /* FUNCTION: uart0_isr()
> *
> * interrupt handler for UART #0
> *
> * PARAMS: none
> *
> * RETURN: none
> */
>
> __declspec(interrupt)
> void
> uart0_isr(void)
> {
> uart_isr(0);
> }
>
>
> /* FUNCTION: uart1_isr()
> *
> * interrupt handler for UART #0
> *
> * PARAMS: none
> *
> * RETURN: none
> */
>
> __declspec(interrupt)
> void
> uart1_isr(void)
> {
> uart_isr(1);
> }
>
>
>
>
>
> ---
> [email protected] Send a post to the list.
> [email protected] Join the list.
> [email protected] Join the list in digest mode.
> [email protected] Leave the list.
>
>
>
> __________ NOD32 3153 (20080602) Information __________
>
> This message was checked by NOD32 antivirus system.
> http://www.eset.com
>
>
---
[email protected] Send a post to the list.
[email protected] Join the list.
[email protected] Join the list in digest mode.
[email protected] Leave the list.