main2.c 4.7 KB

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