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.