‹ x ûÿ
A题-报告8-ç¨‹åºæ¸…å• | ||||
| ||||
A题-报告8-ç¨‹åºæ¸…å• ç¨‹åºæ¸…å• main.c #include "CONTROL.h" int main() { SystemCoreClockUpdate(); system_init(); system_control(); return 0; } KEY.c /* * KEY.c * * Created: 2014/11/23 2:16:59 * Author: zzk */
#include "KEY.h" #include "GLOBAL_VARIABLE.h"
volatile u8 key_value=0; //æŒ‰é”®æ•°æ® static u8 key_data_backup=0; //按键采集数æ®å¤‡ä»½ static u8 press_key_flag=0; //æŒ‰é”®æŒ‰åŽ‹æ ‡å¿— static u8 release_key_flag=1; //æŒ‰é”®é‡Šæ”¾æ ‡å¿—
void key_init(void) { GPIO_InitTypeDef GPIO_InitStructure;//
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
//KEY PB13 PB14 PB15 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; GPIO_Init(GPIOD, &GPIO_InitStructure); }
u8 get_key_data(void) { u8 key_data1=0,key_data2=0; key_data1=(GPIOB->IDR&0XE000)>>8; //PB13 14 15 KEY1 2 3 key_data2=(GPIOD->IDR&0X1F00)>>8; //PD8 9 10 11 12 KEYA B C D PRESS return (key_data1+key_data2); }
u8 key_test(void) { u8 value=get_key_data(); if(value!=0xFF) return 1; return 0; }
void get_key_value(void) { if(release_key_flag==1) //所有按键æ¾å¼€åŽrelease_key_flag值为1,有按键按下时其值为0 { if(press_key_flag==0) { if(key_test()) { key_data_backup=get_key_data(); //æ•èŽ·å½“å‰æŒ‰é”®æ•°æ® press_key_flag=1; //ç¬¬ä¸€æ¬¡æ‰«ææŒ‰é”®ï¼Œæœ‰æŒ‰é”®æŒ‰ä¸‹ } } else if(key_test()) //在第一次通过的情况下第二次如果按键扫æä¾æ—§é€šè¿‡ { if(key_data_backup==get_key_data()) //两次æ•获的数æ®ä¸€è‡´ { switch(key_data_backup) { case KEY1:key_value=key_data_backup;break; case KEY2:key_value=key_data_backup;break; case KEY3:key_value=key_data_backup;break; case KEY4:key_value=key_data_backup;break; case KEY5:key_value=key_data_backup;break; case KEY6:key_value=key_data_backup;break; case KEY7:key_value=key_data_backup;break; case KEY8:key_value=key_data_backup;break; default:break; } release_key_flag=0; } else { press_key_flag=0; } } } else { if(key_test()==0) { release_key_flag=1; press_key_flag=0; } } } PRINTF,c #include "PRINTF.h"
////////////////////////////////////////////////////////////////// //åŠ å…¥ä»¥ä¸‹ä»£ç ,支æŒprintf函数,而ä¸éœ€è¦é€‰æ‹©use MicroLIB #if 1 #pragma import(__use_no_semihosting) //æ ‡å‡†åº“éœ€è¦çš„æ”¯æŒå‡½æ•° struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /* FILE is typedef’ d in stdio.h. */ FILE __stdout; //定义_sys_exit()以é¿å…使用åŠä¸»æœºæ¨¡å¼ _sys_exit(int x) { x = x; } //é‡å®šä¹‰fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循环å‘é€,直到å‘é€å®Œæ¯• USART1->DR = (u8) ch; return ch; } #endif //end //////////////////////////////////////////////////////////////////
void printf_init(void) //输出åˆå§‹åŒ– { stdout_init(); uasrt_DMA_init(); }
void stdout_init(void) //USART1 init TX:PA9 RX:PA10 { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable GPIO clock TX:PA9 RX:PA10*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /* Enable UART clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/* Connect PXx to USARTx_Tx*/ GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
/* Connect PXx to USARTx_Rx*/ GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
/* Configure USART Tx as alternate function */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; // GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART Rx as alternate function */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // GPIO_Init(GPIOA, &GPIO_InitStructure);
/* USART configuration */ /* USARTx configured as follows: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); /* Enable USART interrupts*/ USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); /* Enable USART */ USART_Cmd(USART1, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0; NVIC_InitStructure.NVIC_IRQChannelSubPriority =4; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
void uasrt_DMA_init(void) //usart DMA channel init { NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure;
/* Enable DMA clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
/* Reset DMA Stream registers (for debug purpose) */ DMA_DeInit(DMA2_Stream7);
/* Configure DMA controller to manage USART TX and RX DMA request ----------*/
/* Configure DMA Initialization Structure */ DMA_InitStructure.DMA_BufferSize = 0 ; //æ•°æ®é‡å¾…定 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable ; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single ; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)(&(USART1->DR)) ; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_Priority = DMA_Priority_High; /* Configure TX DMA */ DMA_InitStructure.DMA_Channel = DMA_Channel_4 ; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral ; DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)0 ; //地å€é‡å¾…定 DMA_Init(DMA2_Stream7,&DMA_InitStructure); DMA_ITConfig(DMA2_Stream7,DMA_IT_TC,ENABLE); /* Configure RX DMA */ DMA_InitStructure.DMA_Channel = DMA_Channel_4 ; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ; DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)0 ; //地å€é‡å¾…定 DMA_Init(DMA2_Stream2,&DMA_InitStructure); DMA_ITConfig(DMA2_Stream2,DMA_IT_TC,ENABLE);
/* Enable the DMA Stream IRQ Channel */ NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn; //TXD NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream2_IRQn; //RXD NVIC_Init(&NVIC_InitStructure); }
void usart_send_block_DMA(u32 addr,u16 block_size) //send data using DMA { while((USART1->SR&0X80)==0); DMA2_Stream7->M0AR=addr; DMA2_Stream7->NDTR=block_size; DMA2_Stream7->CR|=0X01; //enable the tx stream /* Enable USART DMA TX Requsts */ USART1->CR3|=(1<<7); }
volatile u8 command=0; void USART1_IRQHandler(void) { command=USART1->DR; if(command==0xFE) NVIC_SystemReset(); //reboot }
void DMA2_Stream7_IRQHandler(void) { DMA2->HIFCR|=(1<<27); //clear the TCIF7 flag }
void DMA2_Stream2_IRQHandler(void) { DMA2->LIFCR|=(1<<21); //clear the TCIF2 flag } TIMER.c #include "TIMER.h" #include "PRINTF.h" #include "KEY.h" #include "GLOBAL_VARIABLE.h"
void systick_init(void) //时基åˆå§‹åŒ– { uint32_t cnts; RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks); cnts = rcc_clocks.HCLK_Frequency /50; //20ms
SysTick_Config(cnts); }
void timer2_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; /* TIM1 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_DeInit(TIM2); //åˆå§‹åŒ–定时器2寄å˜å™¨ TIM_Cmd(TIM2, DISABLE); //Close the timer2 TIM_InternalClockConfig(TIM2); //é€‰æ‹©å†…éƒ¨æ—¶é’Ÿæº TIM_TimeBaseStructure.TIM_Period=19999; // 定义ARR数值 20ms TIM_TimeBaseStructure.TIM_Prescaler=83;//84分频 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //é‡‡æ ·åˆ†é¢‘ï¼Œç”¨æ¥ç¡®å®šå¤šå°‘个触å‘ä¿¡å·æ‰ç®—ä¸€ä¸ªæ•æ‰ TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //å‘ä¸Šè®¡æ•°æ¨¡å¼ TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //é‡å¤è®¡æ•°å™¨ï¼Œä»…定时器1ã€8ã€15ã€16ã€17有æ¤åŠŸèƒ½ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ARRPreloadConfig(TIM2, DISABLE);//ç¦æ¢ARR预装载缓冲器,è¿™æ ·å†™å…¥é¢„è£…è½½å¯„å˜å™¨æ•°å€¼ä¼šç«‹å³æ›´æ–°åˆ°å¯¹åº”的影å寄å˜å™¨ï¼Œè‹¥å°†å…¶ä½¿èƒ½å¯ä»¥ç”¨è½¯ä»¶äº§ç”Ÿä¸€ä¸ªæ›´æ–°äº‹ä»¶ TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);// |