![]()
|
|||||||
Розрахунково – графічна робота ⇐ ПредыдущаяСтр 2 из 2 Розрахунково – графічна робота з курсу «Мікроконтролерне керування» Виконав студент 4 курсу РТФ гр. РВ-11 Артеменко Д. С. Задані параметри мого варіанту: Швидкість 19200 Частота 1000 Гц
#include " NUC1xx. h"
void Timer_initial(void); void InterruptInit(void); void InitADC(void); void uart_tx_char(unsigned char data); void uart_tx_char(unsigned char data); void hex_to_ascii(unsigned int binary, unsigned char *ascii); void uart_transmit(unsigned int data); void InitUSART(void); unsigned int counter = 0;
int main (void) {
//InterruptInit(); Timer_initial(); InitADC(); //uart_transmit(data); //uart_tx_char(counter); while(1){ //uart_transmit(counter++); } } void uart_tx_char(unsigned char data) { while(UART0-> FSR. TE_FLAG == 0) ; UART0-> DATA = data; }
void Timer_initial(void) { /* Step 1. Enable and Select Timer clock source */ SYSCLK-> CLKSEL1. TMR0_S = 0; //Select 12Mhz for Timer0 clk src SYSCLK-> APBCLK. TMR0_EN =1; //Enable Timer0 clock source /* Step 2. Select Operation mode */ TIMER0-> TCSR. MODE=1; //Sel. periodic mode for operation mode /* Step 3. Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/ TIMER0-> TCSR. PRESCALE=0; // Set Prescale [0~255] TIMER0-> TCMPR = 12000; // Set TICR(TCMP) [0~16777215] // (1/12000000)*(0+1)*(12000)= 1msec or 1000Hz. За формулою розраховуємо час. /* Step 4. Enable interrupt */ TIMER0-> TCSR. IE = 1; TIMER0-> TISR. TIF = 1; //Write 1 to clear for safty NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt /* Step 5. Enable Timer module */ TIMER0-> TCSR. CRST = 1; //Reset up counter TIMER0-> TCSR. CEN = 1; //Enable Timer0 TIMER0-> TCSR. TDR_EN=1; // Enable TDR function }
void InitADC(void) { /* Step 1. GPIO initial */ GPIOA-> OFFD|=0x00800000; //Disable digital input path SYS-> GPAMFP. ADC7_SS21_AD6=1; //Set ADC function /* Step 2. Enable and Select ADC clock source, and then enable ADC module */ SYSCLK-> CLKSEL1. ADC_S = 2; //Select 22Mhz for ADC SYSCLK-> CLKDIV. ADC_N = 1; //ADC clock source=22Mhz/2=11Mhz; SYSCLK-> APBCLK. ADC_EN = 1; //Enable clock source ADC-> ADCR. ADEN = 1; //Enable ADC module /* Step 3. Select Operation mode */ ADC-> ADCR. DIFFEN = 0; //single end input ADC-> ADCR. ADMD = 0; //single mode /* Step 4. Select ADC channel */ ADC-> ADCHER. CHEN = 0x80; /* Step 5. Enable ADC interrupt */ ADC-> ADSR. ADF =1; //clear the A/D interrupt flags for safe ADC-> ADCR. ADIE = 1; // NVIC_EnableIRQ(ADC_IRQn); /* Step 6. Enable WDT module */ ADC-> ADCR. ADST=1; }
void InterruptInit(void) { UART0-> IER. RDA_IEN = 1; //Receive Data Available Interrupt Enable // Clear any previous occurred interrupt for port 3 NVIC_ClearPendingIRQ(UART0_IRQn); // Set priority of port 3 interrupt NVIC_SetPriority(UART0_IRQn, 0); // Enable interrupt at NVIC NVIC_EnableIRQ(UART0_IRQn); return; }
void uart_transmit(unsigned int data) { unsigned char buff[5]; hex_to_ascii(data, & buff[0]); uart_tx_char('V'); uart_tx_char(buff[4]); uart_tx_char(buff[3]); uart_tx_char(buff[2]); uart_tx_char(buff[1]); uart_tx_char(buff[0]); uart_tx_char('\n'); uart_tx_char('\r'); }
void hex_to_ascii(unsigned int binary, unsigned char *ascii) { register unsigned char n; for(n = 0; n < = 4; n++)//??????? ??????? ascii[n] = '0'; for(n = 0; n < = 4; n++)//???????????? ? ???????? -?????????? ??? { ascii[n] = (binary % 10) | '0'; binary = binary / 10; if(binary == 0) break; } }
void TMR0_IRQHandler(void) // Timer0 interrupt subroutine { unsigned int tmpres; TIMER0-> TISR. TIF =1;
ADC-> ADSR. ADF=1; //while(ADC-> ADSR. ADF==0) // ; //tmpres = (ADC-> ADDR[7]. RSLT*312 > > 8); uart_transmit(ADC-> ADDR[7]. RSLT); ADC-> ADCR. ADST=1; } INCLUDE reg_def. s AREA |. text|, CODE, READONLY
SystemInit PROC EXPORT SystemInit [WEAK] ; IMPORT ref_def LDR R0, =0x50000100 ; Unlock Register LDR R1, =0x59 STR R1, [R0] LDR R1, =0x16 STR R1, [R0] LDR R1, =0x88 STR R1, [R0]
; Init Clock Gen for 48 MHz LDR R0, =CLK_BA LDR R1, =0x1D; Enable external 4~24 MHz high speed crystal STR R1, [R0]; XTL12M_EN = 1
LDR R1, =0x0000C22E; IN_DV = 0x1, OUT_DV = 0x3, FB_DV = 0x2E STR R1, [R0, #PLLCON]; PLLFOUT = 48 MHz from PLL
MOVS R1, #0x3; SysTick clock source select HCLK/2 LSLS R1, R1, #3 MOVS R2, #0x2 ORRS R1, R2; CLK SRC for CPUCLK, HCLK, PCLK - PLLFOUT STR R1, [R0, #CLKSEL0]
MOVS R1, #0 ; HCLK_N = 0, divide by 1 STR R1, [R0, #CLKDIV]; PLLFOUT = 48 MHz from PLL
; Init GPIO for LED's LDR R0, =GP_BA LDR R1, =0x55000000 LDR R2, =GPIOC_PMD STR R1, [R0, R2]
LDR R1, =0x0000F000 LDR R2, =GPIOC_DOUT STR R1, [R0, R2]
; Init UART0 ; Eiio? ao? ao? y aeaia? a IE aey? iaioe c UART LDR R0, =GCR_BA ; PB. 0 & PB. 1 Pin Function Selection MOVS R2, #0x3; 1-UART0 TXD & RXD STR R2, [R0, #GPB_MFP]; Aecia? aiiy? a? eio? iaioe iiaoey UART0 LDR R0, =UART0_BA MOVS R2, #0 STR R2, [R0, #UA_FUN_SEL]; Neaiae Reset aey UART0 LDR R0, =GCR_BA ; SYS-> IPRSTC2. UART0_RST = 1; MOVS R2, #0x1 ; SYS-> IPRSTC2. UART0_RST = 0; LSLS R2, #16 STR R2, [R0, #IPRSTC2] MOVS R2, #0x0 STR R2, [R0, #IPRSTC2]; Aa? ieiaiiy UART0 LDR R0, =CLK_BA ; SYSCLK-> APBCLK. UART0_EN = 1; MOVS R2, #0x1; LSLS R2, #16 STR R2, [R0, #APBCLK]; Neaiae neeaaiiy aey aooa?? a Tx oa Rx FIFO LDR R0, =UART0_BA; Set Rx Trigger Level (FCR. RFITL) MOVS R2, #0x6; STR R2, [R0, #UA_FCR]; Oiiao aaieo: e-ou? ic?. aaieo, noiiiaeo a? o, LDR R0, =UART0_BA; ia? aa?? ea ia ia? i? nou MOVS R2, #0x3; 1 StopBits; No Parity; STR R2, [R0, #UA_LCR]; Set Time-Out (TOR. TOIC) LDR R0, =UART0_BA MOVS R2, #0x1; LSLS R2, #12; TX Delay Time Value STR R2, [R0, #UA_TOR]; Iaeaoooaaiiy oaeoiaiai neaiaeo aey iiaoey UART0 LDR R0, =CLK_BA; SYSCLK-> CLKSEL1. UART_S = 0; LDR R1, =0x00000000; XTL12M to UART STR R1, [R0, #CLKSEL1]; Mode 2, Baud rate = UART_CLK / (A+2), A must > =3 LDR R0, =UART0_BA; Baud rate =2400 LDR R2, =0x3f00026F; DIV_X_EN=1; DIV_X_ONE=1; A=0x66 З дата шиту до мікроконтролера обираємо формулу і розраховуємо 0x3f00026F STR R2, [R0, #UA_BAUD]
; SysTick Timer Init to form 1 ms ; LDR R0, =SCS_BA ; LDR R1, =47999 ; STR R1, [R0, #SYST_RVR] ; MOVS R1, #0 ; STR R1, [R0, #SYST_CVR] ; MOVS R1, #5 ; STR R1, [R0, #SYST_CSR]
; Lock register LDR R0, =0x50000100 MOVS R1, #0 STR R1, [R0]
BX LR ENDP END
|
|||||||
|