|
該程序可以實(shí)現(xiàn)在stm32上實(shí)現(xiàn)屏幕顯示和鍵盤輸入控制
單片機(jī)源程序如下:
- #include "stm32f10x.h"
- #include "stdio.h"
- #include "string.h"
- #include "drivers.h"
- // dds base freq : 0.9765625HZ
- /*------------------Macro Defines----------------------------------*/
- #define SYSTEMTICK_PERIOD_MS 10
- #define LED_PERIOD 1000
- /*------------------------------------------------------------------*/
- struct DDS_PARA{
- uint8_t wave_type;
- uint32_t freq_step;
- uint32_t freq;
- uint8_t phase;
- };
- enum PARA_TYPE{ NONE = 0, FREQ = 1, PHASE = 2};
- /*------------------------------------------------------------------*/
- extern uint8_t usart2_rx_buf[255];
- extern uint8_t usart2_frame_end;
- __IO uint32_t _localTimeTick_ms = 0;
- uint8_t usart_frame_buf[UART_FRAME_LENGTH] = {0};
- uint16_t frame_seq = 0;
- struct DDS_PARA dds_para_data;
- enum PARA_TYPE setting_type = FREQ;
- /*------------------------------------------------------------------*/
- uint8_t process_data_from_fpga(uint8_t* data_buf, uint8_t data_len);
- void lcd_update(void);
- uint8_t porcess_keybard_value(UserAckKeyValueType key_value);
- void lcd_update_actual_freq(void);
- /*------------------------------------------------------------------*/
- void SysTick_Handler(void) {
- _localTimeTick_ms += SYSTEMTICK_PERIOD_MS;
- }
- uint32_t local_ticktime() {
- return _localTimeTick_ms;
- }
- bool timeout(uint32_t last_time, uint32_t ms) {
- return (bool)((_localTimeTick_ms - last_time) > ms);
- }
- void flash_led(void)
- {
- static uint32_t timer_tick;
- static uint8_t led_status;
-
- if(timeout( timer_tick, LED_PERIOD))
- {
- if(led_status == 0)
- {
- GPIO_ResetBits(RED_LED_GPIO, RED_LED_PIN);
- led_status = 1;
- }
- else
- {
- GPIO_SetBits(RED_LED_GPIO, RED_LED_PIN);
- led_status = 0;
- }
- timer_tick = local_ticktime();
- }
- }
- void flush_dds_para(void)
- {
- dds_para_data.freq = 0;
- dds_para_data.phase = 0;
- setting_type = FREQ;
- }
- void init_data(void)
- {
- //frame header
- usart_frame_buf[0] = PROTOCOL_UART_FRAME_START_SYMBOL_1;
- usart_frame_buf[1] = PROTOCOL_UART_FRAME_START_SYMBOL_2;
- usart_frame_buf[2] = 0x90;
- usart_frame_buf[3] = 0x07;
- //CRC
- usart_frame_buf[12] = 0;
- usart_frame_buf[13] = 0;
- //frame tail
- usart_frame_buf[14] = PROTOCOL_UART_FRAME_END_SYMBOL_1;
- usart_frame_buf[15] = PROTOCOL_UART_FRAME_END_SYMBOL_2;
-
- flush_dds_para();
- LCD_ShowString(50, 20, 16, "DDS SIGNAL GENERTAOR" ,0);
- LCD_ShowString(20, 60, 16, "Freq(HZ)(Goal):" ,0);
- LCD_ShowString(20, 90, 16, "Freq(HZ)(Fact):" ,0);
- LCD_ShowString(266, 90, 16, "." ,0);
- LCD_ShowString(20, 120, 16, "Phase(degree):" ,0);
- LCD_ShowString(20, 150, 16, "Input data:" ,0);
- LCD_ShowString(20, 180, 16, "Setting Type(L-R):" ,0);
- LCD_ShowString(200, 180, 16, "FREQ " ,0);
- }
- void init_drivers(void)
- {
- rcc_configuration();
- GPIO_PinRemapConfig( GPIO_Remap_SWJ_JTAGDisable, ENABLE );
- led_init();
- init_keyBoard();
- uart2_init();
- init_lcd();
- }
- int main(void)
- {
- uint8_t fpga_ack = 0;
- uint8_t resend_times = 0;
- uint32_t usart_reack_timeout = 0;
- UserAckKeyValueType keyVal;
- float dds_step;
-
- init_drivers();
- init_data();
- while(1)
- {
- flash_led();
- if(usart2_frame_end == 1)
- {
- if(process_data_from_fpga(usart2_rx_buf, UART_FRAME_LENGTH) == 1)
- {
- fpga_ack = 0;
- lcd_update_actual_freq();
- }
- memset(usart2_rx_buf, 0, UART_FRAME_LENGTH);
- usart2_frame_end = 0;
- }
- if(fpga_ack == 1)
- {
- if(timeout(usart_reack_timeout, 2000))
- {
- resend_times++;
- usart2_send_string(usart_frame_buf, UART_FRAME_LENGTH);
- usart_reack_timeout = local_ticktime();
- }
- if(resend_times >= 2)
- {
- fpga_ack = 0;
- resend_times = 0;
- }
- }
- if((keyVal = keyValueToUserAck()) != NOKEY)
- {
- if(porcess_keybard_value(keyVal))
- {
- dds_step = (dds_para_data.freq/0.9765625);
- dds_para_data.freq_step = dds_step;
- if((uint32_t)(dds_step/0.5)/2 == 1)
- {
- dds_para_data.freq_step++;
- }
- lcd_update();
- frame_seq++;
- usart_frame_buf[4] = frame_seq >> 8;
- usart_frame_buf[5] = (uint8_t)frame_seq ;
- usart_frame_buf[6] = (uint8_t)(dds_para_data.freq_step >> 24);
- usart_frame_buf[7] = (uint8_t)(dds_para_data.freq_step >> 16);
- usart_frame_buf[8] = (uint8_t)(dds_para_data.freq_step >> 8 );
- usart_frame_buf[9] = (uint8_t)dds_para_data.freq_step;
- usart_frame_buf[10] = dds_para_data.phase;
- usart2_send_string(usart_frame_buf, UART_FRAME_LENGTH);
- fpga_ack = 1;
- usart_reack_timeout = local_ticktime();
- }
- }
- }
- }
- uint8_t process_data_from_fpga(uint8_t* data_buf, uint8_t data_len){
- uint8_t temp_data_buf[20] = {0};
- uint8_t i;
-
- if(data_len > 20)
- {
- return 0;
- }
-
- for(i = 0; i < data_len; i++)
- {
- temp_data_buf[i] = data_buf[i];
- }
- switch(temp_data_buf[2])
- {
- case 0x80: //from fpga
- {
- if(temp_data_buf[3] == 0x03)
- {
- if(temp_data_buf[6] == 0xA5)
- return 1;
- }
- }
- break;
- default: break;
- }
- return 0;
- }
- void lcd_update_actual_freq(void)
- {
- float actual_freq;
-
- actual_freq = dds_para_data.freq_step * 0.9765625;
- LCD_ShowNum(170, 90, actual_freq, 12, 16);
- LCD_ShowNum(270, 90, (uint32_t)(actual_freq*100)%100, 3, 16);
- }
- void lcd_update(void)
- {
- uint32_t updated_freq ;
- uint16_t updated_phase;
-
- updated_freq = dds_para_data.freq;
- updated_phase = dds_para_data.phase;
- LCD_ShowNum(200, 60, updated_freq, 12, 16);
-
- LCD_ShowNum(200, 120, updated_phase, 12, 16);
- }
- uint8_t porcess_keybard_value(UserAckKeyValueType key_value)
- {
- static uint32_t temp_value;
-
- if(key_value < 10)
- {
- temp_value = temp_value*10 + (uint8_t) key_value;
- LCD_ShowNum(200, 150, temp_value, 12, 16);
- }
-
- if(key_value == KEY_OK)
- {
- if(setting_type == FREQ)
- {
- dds_para_data.freq = temp_value;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
DDS波形顯示.rar
(224.84 KB, 下載次數(shù): 25)
2018-5-9 20:16 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|