久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2935|回復: 1
打印 上一主題 下一主題
收起左側

關于DDS在stm32單片機上顯示的有關程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:325679 發表于 2018-5-9 10:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
該程序可以實現在stm32上實現屏幕顯示和鍵盤輸入控制

單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include "stdio.h"
  3. #include "string.h"
  4. #include "drivers.h"

  5. // dds base freq : 0.9765625HZ
  6. /*------------------Macro Defines----------------------------------*/
  7. #define SYSTEMTICK_PERIOD_MS  10
  8. #define LED_PERIOD  1000

  9. /*------------------------------------------------------------------*/
  10. struct DDS_PARA{
  11.         uint8_t wave_type;
  12.         uint32_t freq_step;
  13.         uint32_t freq;
  14.         uint8_t phase;
  15. };
  16. enum PARA_TYPE{ NONE = 0, FREQ = 1, PHASE = 2};
  17. /*------------------------------------------------------------------*/
  18. extern uint8_t usart2_rx_buf[255];
  19. extern uint8_t usart2_frame_end;
  20. __IO uint32_t _localTimeTick_ms = 0;

  21. uint8_t usart_frame_buf[UART_FRAME_LENGTH] = {0};
  22. uint16_t frame_seq = 0;
  23. struct DDS_PARA dds_para_data;
  24. enum PARA_TYPE setting_type = FREQ;
  25. /*------------------------------------------------------------------*/
  26. uint8_t process_data_from_fpga(uint8_t* data_buf, uint8_t data_len);
  27. void lcd_update(void);
  28. uint8_t porcess_keybard_value(UserAckKeyValueType key_value);
  29. void lcd_update_actual_freq(void);
  30. /*------------------------------------------------------------------*/
  31. void SysTick_Handler(void) {
  32.         _localTimeTick_ms += SYSTEMTICK_PERIOD_MS;
  33. }

  34. uint32_t local_ticktime() {
  35.         return _localTimeTick_ms;
  36. }

  37. bool timeout(uint32_t last_time, uint32_t ms) {
  38.         return (bool)((_localTimeTick_ms - last_time) > ms);
  39. }

  40. void flash_led(void)
  41. {
  42.         static uint32_t timer_tick;
  43.         static uint8_t led_status;
  44.        
  45.         if(timeout( timer_tick, LED_PERIOD))
  46.         {
  47.                 if(led_status == 0)
  48.                 {
  49.                         GPIO_ResetBits(RED_LED_GPIO, RED_LED_PIN);
  50.                         led_status = 1;
  51.                 }
  52.                 else
  53.                 {
  54.                         GPIO_SetBits(RED_LED_GPIO, RED_LED_PIN);
  55.                         led_status = 0;
  56.                 }
  57.                 timer_tick = local_ticktime();
  58.         }
  59. }
  60. void flush_dds_para(void)
  61. {
  62.         dds_para_data.freq = 0;
  63.         dds_para_data.phase = 0;
  64.         setting_type = FREQ;
  65. }
  66. void init_data(void)
  67. {
  68.         //frame header
  69.         usart_frame_buf[0] = PROTOCOL_UART_FRAME_START_SYMBOL_1;       
  70.         usart_frame_buf[1] = PROTOCOL_UART_FRAME_START_SYMBOL_2;
  71.         usart_frame_buf[2] = 0x90;
  72.         usart_frame_buf[3] = 0x07;
  73.         //CRC
  74.         usart_frame_buf[12] = 0;
  75.         usart_frame_buf[13] = 0;
  76.         //frame tail
  77.         usart_frame_buf[14] = PROTOCOL_UART_FRAME_END_SYMBOL_1;
  78.         usart_frame_buf[15] = PROTOCOL_UART_FRAME_END_SYMBOL_2;
  79.        
  80.         flush_dds_para();
  81.         LCD_ShowString(50,  20,  16, "DDS SIGNAL GENERTAOR" ,0);
  82.         LCD_ShowString(20,  60,  16, "Freq(HZ)(Goal):" ,0);       
  83.         LCD_ShowString(20,  90,  16, "Freq(HZ)(Fact):" ,0);       
  84.         LCD_ShowString(266,  90,  16, "." ,0);       
  85.         LCD_ShowString(20,  120,  16, "Phase(degree):" ,0);       
  86.         LCD_ShowString(20,  150, 16, "Input data:" ,0);
  87.         LCD_ShowString(20,  180, 16, "Setting Type(L-R):" ,0);
  88.         LCD_ShowString(200, 180, 16, "FREQ " ,0);
  89. }

  90. void init_drivers(void)
  91. {
  92.         rcc_configuration();
  93.         GPIO_PinRemapConfig( GPIO_Remap_SWJ_JTAGDisable, ENABLE );
  94.         led_init();
  95.         init_keyBoard();
  96.         uart2_init();
  97.         init_lcd();
  98. }
  99. int main(void)
  100. {
  101.         uint8_t fpga_ack = 0;
  102.         uint8_t resend_times = 0;
  103.         uint32_t usart_reack_timeout = 0;
  104.         UserAckKeyValueType keyVal;
  105.         float dds_step;
  106.        
  107.         init_drivers();
  108.         init_data();
  109.         while(1)
  110.         {               
  111.                 flash_led();
  112.                 if(usart2_frame_end == 1)
  113.                 {
  114.                         if(process_data_from_fpga(usart2_rx_buf, UART_FRAME_LENGTH) == 1)
  115.                         {
  116.                                 fpga_ack = 0;
  117.                                 lcd_update_actual_freq();
  118.                         }
  119.                         memset(usart2_rx_buf, 0, UART_FRAME_LENGTH);
  120.                         usart2_frame_end = 0;
  121.                 }

  122.                 if(fpga_ack == 1)
  123.                 {                               
  124.                         if(timeout(usart_reack_timeout, 2000))
  125.                         {
  126.                                 resend_times++;
  127.                                 usart2_send_string(usart_frame_buf, UART_FRAME_LENGTH);
  128.                                 usart_reack_timeout = local_ticktime();
  129.                         }               
  130.                         if(resend_times >= 2)
  131.                         {
  132.                                 fpga_ack = 0;
  133.                                 resend_times = 0;
  134.                         }                               
  135.                 }
  136.                 if((keyVal = keyValueToUserAck()) != NOKEY)
  137.                 {                       
  138.                         if(porcess_keybard_value(keyVal))
  139.                         {                               
  140.                                 dds_step = (dds_para_data.freq/0.9765625);
  141.                                 dds_para_data.freq_step = dds_step;
  142.                                 if((uint32_t)(dds_step/0.5)/2 == 1)
  143.                                 {
  144.                                                 dds_para_data.freq_step++;
  145.                                 }
  146.                                 lcd_update();
  147.                                 frame_seq++;
  148.                                 usart_frame_buf[4] = frame_seq >> 8;
  149.                                 usart_frame_buf[5] = (uint8_t)frame_seq ;
  150.                                 usart_frame_buf[6] = (uint8_t)(dds_para_data.freq_step >> 24);
  151.                                 usart_frame_buf[7] = (uint8_t)(dds_para_data.freq_step >> 16);
  152.                                 usart_frame_buf[8] = (uint8_t)(dds_para_data.freq_step >> 8 );
  153.                                 usart_frame_buf[9] = (uint8_t)dds_para_data.freq_step;
  154.                                 usart_frame_buf[10] = dds_para_data.phase;
  155.                                 usart2_send_string(usart_frame_buf, UART_FRAME_LENGTH);
  156.                                 fpga_ack = 1;
  157.                                 usart_reack_timeout = local_ticktime();
  158.                         }
  159.                 }
  160.         }
  161. }

  162. uint8_t process_data_from_fpga(uint8_t* data_buf, uint8_t data_len){
  163.         uint8_t temp_data_buf[20] = {0};
  164.         uint8_t i;
  165.        
  166.         if(data_len > 20)
  167.         {
  168.                 return 0;
  169.         }
  170.        
  171.         for(i = 0; i < data_len; i++)
  172.         {
  173.                 temp_data_buf[i] = data_buf[i];
  174.         }

  175.         switch(temp_data_buf[2])
  176.         {
  177.                 case 0x80: //from fpga
  178.                         {                               
  179.                                 if(temp_data_buf[3] == 0x03)
  180.                                 {
  181.                                         if(temp_data_buf[6] == 0xA5)
  182.                                                 return 1;
  183.                                 }                                                        
  184.                         }
  185.                         break;
  186.                 default: break;
  187.         }
  188.         return 0;
  189. }

  190. void lcd_update_actual_freq(void)
  191. {
  192.         float actual_freq;
  193.        
  194.         actual_freq = dds_para_data.freq_step * 0.9765625;
  195.         LCD_ShowNum(170, 90, actual_freq,  12, 16);       
  196.         LCD_ShowNum(270, 90, (uint32_t)(actual_freq*100)%100,  3, 16);
  197. }
  198. void lcd_update(void)
  199. {
  200.         uint32_t updated_freq ;
  201.         uint16_t updated_phase;
  202.        
  203.         updated_freq = dds_para_data.freq;
  204.         updated_phase = dds_para_data.phase;
  205.         LCD_ShowNum(200, 60, updated_freq,  12, 16);       
  206.        
  207.         LCD_ShowNum(200, 120, updated_phase, 12, 16);       
  208. }

  209. uint8_t porcess_keybard_value(UserAckKeyValueType key_value)
  210. {
  211.         static uint32_t temp_value;
  212.        
  213.         if(key_value < 10)
  214.         {
  215.                 temp_value = temp_value*10 + (uint8_t) key_value;
  216.                 LCD_ShowNum(200, 150, temp_value, 12, 16);       
  217.         }
  218.        
  219.         if(key_value == KEY_OK)
  220.         {
  221.                 if(setting_type == FREQ)
  222.                 {
  223.                                 dds_para_data.freq = temp_value;
  224.                 }
  225. ……………………

  226. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
DDS波形顯示.rar (224.84 KB, 下載次數: 25)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:557871 發表于 2019-8-7 20:59 | 只看該作者
好像要
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情国产日韩精品一区18 | 九色在线视频 | 精品国产乱码久久久 | 欧美国产中文 | 日日夜夜影院 | 久久网亚洲 | 成人免费在线播放 | 日韩精品一区二区三区 | 亚洲免费在线视频 | 四虎影院一区二区 | 国产高清一区二区三区 | 午夜国产 | 中文字幕日韩欧美一区二区三区 | 国产高潮好爽受不了了夜夜做 | 国产午夜精品久久久久 | 天天天插| 婷婷色在线 | 中文精品视频 | 日本精品999 | 亚洲精品第一国产综合野 | 日韩不卡一区二区三区 | 91亚洲国产成人久久精品网站 | 亚洲免费在线观看 | 亚洲一区二区久久 | 久久成人精品 | 国产精品国产成人国产三级 | 欧美一区视频在线 | 国产91在线 | 亚洲 | 日韩欧美中文字幕在线视频 | 精品亚洲一区二区三区 | av影音资源| 久色视频在线观看 | 欧美一区二区在线看 | 在线成人一区 | 91在线观看视频 | 在线免费观看色 | 日韩毛片中文字幕 | 欧美国产日韩在线观看 | 不卡欧美| 女女百合av大片一区二区三区九县 | 亚洲日本免费 |