main.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #ifndef USE_FULL_ASSERT
  2. #define assert_param(x)
  3. #endif
  4. #include "stm32f10x.h"
  5. #include "stm32f10x_gpio.h"
  6. #include "stm32f10x_dma.h"
  7. #include "stm32f10x_dma.c"
  8. #include "stm32f10x_sdio.h"
  9. #include "stm32f10x_sdio.c"
  10. //#include "stm32f10x_rcc.h"
  11. #include "sdcard.h"
  12. #include "sdcard.c"
  13. #include "stm32f10x_adc.h"
  14. #include "stm32f10x_adc.c"
  15. #include "stm32f10x_rcc.h"
  16. #include <string.h>
  17. uint32_t writeBuffer[4];
  18. uint32_t readBuffer[128];
  19. SD_CardInfo SDCardInfo;
  20. int Voltage = 0;
  21. void USART1_Init(void); //Объявление функции инициализации GPIOA и USART1
  22. void USART1_Send_Sym(char str); //Объявление функции передачи одиночного символа
  23. void USART1_Send_Str(char* str); // Объявляем функцию передачи строки
  24. void USART1_Send_endln();
  25. void ADC_Configuration(void);
  26. u16 readADC1(u8 channel);
  27. char buffer[32];
  28. void reverse(char s[])
  29. {
  30. int i, j;
  31. char c;
  32. for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
  33. c = s[i];
  34. s[i] = s[j];
  35. s[j] = c;
  36. }
  37. }
  38. void itoa(int n, char s[])
  39. {
  40. int i, sign;
  41. if ((sign = n) < 0) /* записываем знак */
  42. n = -n; /* делаем n положительным числом */
  43. i = 0;
  44. do { /* генерируем цифры в обратном порядке */
  45. s[i++] = n % 10 + '0'; /* берем следующую цифру */
  46. } while ((n /= 10) > 0); /* удаляем */
  47. if (sign < 0)
  48. s[i++] = '-';
  49. s[i] = '\0';
  50. reverse(s);
  51. }
  52. void USART1_Init()
  53. {
  54. //RCC
  55. RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN); //Включаем тактирование GPIOA и USART1
  56. //GPIOA
  57. GPIOB->CRH |= (GPIO_CRH_CNF10_1 | GPIO_CRH_MODE9); //GPIOA - выход Push_Pull, альтернативная функция, скорость 50 МГц
  58. //USART1
  59. USART1->CR1 |= USART_CR1_UE; //Включаем USART1
  60. USART1->CR1 &= ~USART_CR1_M; //Размерность слова данных - 8 бит
  61. USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
  62. // USART1->BRR = 0x9C4; //Скорость обмена 9600 бод
  63. USART1->BRR = 0xD1; //Скорость обмена 115200 бод
  64. USART1->CR1 |= USART_CR1_TE; //Включаем передатчик USART1
  65. }
  66. void USART1_Send_Sym(char data)
  67. {
  68. while(!(USART1->SR & USART_SR_TC)); //Проверка завершения передачи предыдущих данных
  69. USART1->DR = data; //Передача данных
  70. }
  71. void USART1_Send_Str(char* str)
  72. {
  73. uint8_t i=0;
  74. while(str[i])
  75. {
  76. USART1_Send_Sym(str[i]);
  77. i++;
  78. }
  79. }
  80. void USART1_Send_endln()
  81. {
  82. USART1_Send_Sym('\r');
  83. USART1_Send_Sym('\n');
  84. }
  85. void ADC_Configuration(void)
  86. {
  87. ADC_InitTypeDef ADC_InitStructure;
  88. /* PCLK2 is the APB2 clock */
  89. /* ADCCLK = PCLK2/6 = 72/6 = 12MHz*/
  90. RCC_ADCCLKConfig(RCC_PCLK2_Div4);
  91. /* Enable ADC1 clock so that we can talk to it */
  92. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  93. /* Put everything back to power-on defaults */
  94. ADC_DeInit(ADC1);
  95. /* ADC1 Configuration ------------------------------------------------------*/
  96. /* ADC1 and ADC2 operate independently */
  97. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  98. /* Disable the scan conversion so we do one at a time */
  99. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  100. /* Don't do contimuous conversions - do them on demand */
  101. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  102. /* Start conversin by software, not an external trigger */
  103. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  104. /* Conversions are 12 bit - put them in the lower 12 bits of the result */
  105. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  106. /* Say how many channels would be used by the sequencer */
  107. ADC_InitStructure.ADC_NbrOfChannel = 1;
  108. /* Now do the setup */
  109. ADC_Init(ADC1, &ADC_InitStructure);
  110. /* Enable ADC1 */
  111. ADC_Cmd(ADC1, ENABLE);
  112. /* Enable ADC1 reset calibaration register */
  113. ADC_ResetCalibration(ADC1);
  114. /* Check the end of ADC1 reset calibration register */
  115. while(ADC_GetResetCalibrationStatus(ADC1));
  116. /* Start ADC1 calibaration */
  117. ADC_StartCalibration(ADC1);
  118. /* Check the end of ADC1 calibration */
  119. while(ADC_GetCalibrationStatus(ADC1));
  120. }
  121. u16 readADC1(u8 channel){
  122. ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_41Cycles5);
  123. // начинаем работу
  124. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  125. // ждём пока преобразуется напряжение в код
  126. while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
  127. // возвращаем результат
  128. return ADC_GetConversionValue(ADC1);
  129. }
  130. /*******************************************************************/
  131. int main()
  132. {
  133. // Тестовые данные для записи
  134. // ADC_Configuration();
  135. while(1)
  136. {
  137. Voltage = readADC1(10);
  138. // Voltage = 212345;
  139. // itoa(Voltage,buffer);
  140. for(uint32_t i=0; i<0x0001FFFF; i++); //Временная задержка
  141. }
  142. }