Advertisement
Guest User

Untitled

a guest
May 2nd, 2023
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.66 KB | None | 0 0
  1. #include "stm32f407xx.h"
  2. int data[3];
  3. int tempc = 0;
  4. double voltage = 0;
  5. void delay(){
  6. int i = 1000;
  7. while(i >= 0){
  8. --i;
  9. }
  10. GPIOA->BSRR |= GPIO_BSRR_BS2; //CS 1
  11. i = 10000;
  12. while(i >= 0){
  13. --i;
  14. }
  15. GPIOA->BSRR |= GPIO_BSRR_BR2; //CS 1
  16. }
  17. void RCC_init(void)
  18. {
  19. //HSE
  20. RCC->CR |= RCC_CR_HSEON;
  21. //flash
  22. FLASH->ACR |= FLASH_ACR_PRFTEN;
  23. FLASH->ACR |= FLASH_ACR_LATENCY_3WS;
  24. //pll
  25. RCC->PLLCFGR &= RCC_PLLCFGR_PLLM_4;
  26. RCC->PLLCFGR &= RCC_PLLCFGR_PLLN_6;
  27. RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE;
  28. RCC->PLLCFGR |= RCC_PLLCFGR_PLLM_2;
  29. RCC->PLLCFGR |= RCC_PLLCFGR_PLLN_3;
  30. RCC->PLLCFGR |= RCC_PLLCFGR_PLLN_5;
  31. RCC->PLLCFGR |= RCC_PLLCFGR_PLLN_7;
  32. RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
  33. RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
  34. RCC->CR |= RCC_CR_PLLON;
  35. //MCO
  36. RCC->CFGR |= RCC_CFGR_MCO1PRE_2;
  37. RCC->CFGR |= RCC_CFGR_MCO1_0;
  38. RCC->CFGR |= RCC_CFGR_MCO1_1;
  39. RCC->CFGR |= RCC_CFGR_SW_1;
  40. //GPIO
  41. RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
  42. RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
  43. //PERIPH
  44. RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
  45. RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
  46.  
  47. }
  48. void GPIO_init(void)
  49. {
  50. GPIOA->MODER |= GPIO_MODER_MODE8_1;
  51. GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEED8_0; //1 в 0-й бит скорости пина 8 MCO
  52. GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEED8_1; //1 в 1-й бит скорости пина
  53. GPIOA->MODER |= GPIO_MODER_MODE9_1; //альтернативный режим для Tx пина usart1
  54. GPIOA->MODER |= GPIO_MODER_MODE10_1; //альтернативный режим для Rx пина usart1
  55. GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9_1;
  56. GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10_1; //высокая скорость для Tx пина usart1
  57. GPIOA->AFR[1]|=0x770; //единичка в массиве указывает на AFRH, для ввода в AFRL нужен 0. 0x770 = 0111 0111 0000 на каждый пин 4 бита, 0111 на 10, 0111 на 9, 0000 на 8
  58. GPIOA->AFR[0]|=0x55550000;
  59. // GPIOB->AFR[0]|=0x555000;
  60. GPIOA->MODER |= GPIO_MODER_MODE7_1;
  61. GPIOA->MODER |= GPIO_MODER_MODE6_1;
  62. // GPIOA->MODER |= GPIO_MODER_MODE4_1; //режим альтернативный
  63. GPIOA->MODER |= GPIO_MODER_MODE4_0;
  64. GPIOA->MODER |= GPIO_MODER_MODE5_1; //режим альтернативный
  65. GPIOA->MODER |= GPIO_MODER_MODE0_0;
  66. GPIOA->MODER |= GPIO_MODER_MODE1_0;
  67. GPIOA->MODER |= GPIO_MODER_MODE2_0;
  68. GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7;
  69. GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6;
  70. GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5;
  71. }
  72. void usart1_init(void){
  73. USART1->CR1 |= USART_CR1_UE; //включение usart
  74. // USART1->CR1 |= USART_CR1_M; //длина слова 9 бит
  75. // скорости usart, высчитываются по fapb2/baudrate (84000000/9600или115200)
  76. // USART1->BRR = 8750; //9600 бод
  77. USART1->BRR |= 0x2D9; //=729 115200 бод
  78. USART1->CR1 |= USART_CR1_TE;
  79. USART1->CR1 |= USART_CR1_RE;
  80.  
  81.  
  82. }
  83. void spi1_init(void) {
  84.  
  85. // SPI1->CR1 |= SPI_CR1_CPOL;
  86. SPI1->CR1 |= SPI_CR1_BR;
  87. // SPI1->CR1 |= SPI_CR1_RXONLY;
  88. // SPI1->CR1 |= SPI_CR1_CPOL;
  89. SPI1->CR1 |= SPI_CR1_SSM;
  90. SPI1->CR1 |= SPI_CR1_SSI;
  91. SPI1->CR1 |= SPI_CR1_MSTR;
  92. // SPI1->CR1 |= SPI_CR1_DFF; //16 бит режим
  93. SPI1->CR1 |= SPI_CR1_SPE;
  94. // SPI1->CR1 |= SPI_CR1_CPHA;
  95. }
  96. void DISPLAY_init(){
  97. GPIOA->BSRR |= GPIO_BSRR_BS2; //CS 1
  98. int i = 10000;
  99. while(i >= 0){
  100. --i;
  101. }
  102. GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0
  103. GPIOA->BSRR |= GPIO_BSRR_BS1; //RESET HIGH
  104. GPIOA->BSRR |= GPIO_BSRR_BR2; //CS 0
  105. SPI1->DR = 0x1;
  106. i = 1000000;
  107. while(i >= 0){
  108. --i;
  109. }
  110. SPI1->DR = 0x11;
  111. while(!(SPI1->SR & SPI_SR_TXE)){};
  112. i = 1000000;
  113. while(i >= 0){
  114. --i;
  115. }
  116. delay();
  117. // SPI1->DR = 0x21;
  118. // while(!(SPI1->SR & SPI_SR_TXE)){};
  119. // delay();
  120. SPI1->DR = 0x13;
  121. while(!(SPI1->SR & SPI_SR_TXE)){};
  122. delay();
  123. SPI1->DR = 0x29;
  124. while(!(SPI1->SR & SPI_SR_TXE)){};
  125. delay();
  126. SPI1->DR = 0x3A;
  127. while(!(SPI1->SR & SPI_SR_TXE)){};
  128. while(SPI1->SR & SPI_SR_BSY){};
  129. delay();
  130. GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1
  131. SPI1->DR = 0x55;
  132. while(!(SPI1->SR & SPI_SR_TXE)){};
  133. while(SPI1->SR & SPI_SR_BSY){};
  134. delay();
  135.  
  136. GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0
  137.  
  138. SPI1->DR = 0x36;
  139. while(!(SPI1->SR & SPI_SR_TXE)){};
  140. while(SPI1->SR & SPI_SR_BSY){};
  141. delay();
  142.  
  143. GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1
  144.  
  145. SPI1->DR = 0x0;
  146. while(!(SPI1->SR & SPI_SR_TXE)){};
  147. while(SPI1->SR & SPI_SR_BSY){};
  148. delay();
  149.  
  150. GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0
  151.  
  152. SPI1->DR = 0x2A;
  153. while(!(SPI1->SR & SPI_SR_TXE)){};
  154. while(SPI1->SR & SPI_SR_BSY){};
  155. delay();
  156.  
  157. GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1
  158.  
  159. SPI1->DR =0x0;
  160. while(!(SPI1->SR & SPI_SR_TXE)){};
  161. SPI1->DR =0x0;
  162. while(!(SPI1->SR & SPI_SR_TXE)){};
  163. SPI1->DR =0x0;
  164. while(!(SPI1->SR & SPI_SR_TXE)){};
  165. SPI1->DR =0xEF;
  166. while(!(SPI1->SR & SPI_SR_TXE)){};
  167. while(SPI1->SR & SPI_SR_BSY){};
  168. delay();
  169.  
  170. GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0
  171.  
  172. SPI1->DR =0x2B;
  173. while(!(SPI1->SR & SPI_SR_TXE)){};
  174. while(SPI1->SR & SPI_SR_BSY){};
  175. delay();
  176.  
  177. GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1
  178. delay();
  179.  
  180. SPI1->DR = 0x0;
  181. while(!(SPI1->SR & SPI_SR_TXE)){};
  182. SPI1->DR = 0x0;
  183. while(!(SPI1->SR & SPI_SR_TXE)){};
  184. SPI1->DR = 0x1;
  185. while(!(SPI1->SR & SPI_SR_TXE)){};
  186. SPI1->DR = 0x3F;
  187. while(!(SPI1->SR & SPI_SR_TXE)){};
  188. while(SPI1->SR & SPI_SR_BSY){};
  189. delay();
  190.  
  191. GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0
  192. delay();
  193.  
  194. SPI1->DR = 0x2C;
  195. while(!(SPI1->SR & SPI_SR_TXE)){};
  196. while(SPI1->SR & SPI_SR_BSY){};
  197. delay();
  198.  
  199. GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1
  200. delay();
  201.  
  202. GPIOA->BSRR |= GPIO_BSRR_BS2; //CS 1
  203. GPIOA->BSRR |= GPIO_BSRR_BR2; //CS 0
  204. }
  205. void displaydata(){
  206. int i = 77000;
  207. while(i>=0){
  208. --i;
  209. SPI1->DR = 0x00;
  210. while(!(SPI1->SR & SPI_SR_TXE)){};
  211. SPI1->DR = 0x00;
  212. while(!(SPI1->SR & SPI_SR_TXE)){};
  213.  
  214. }
  215. GPIOA->BSRR |= GPIO_BSRR_BS2; //CS 0
  216. }
  217. void ADC_init(){
  218. GPIOA->BSRR |= GPIO_BSRR_BS4; //CHIPSELECT HIGH
  219. int i = 1000;
  220. while(i >= 0){
  221. --i;
  222. }
  223. GPIOA->BSRR |= GPIO_BSRR_BR4; //CHIPSELECT LOW
  224. SPI1->DR = 0x40; //WREG
  225. while(!(SPI1->SR & SPI_SR_TXE)){}; //ждём пока регистр отправки не опустеет
  226. SPI1->DR = 0x1; //01 REG
  227. while(!(SPI1->SR & SPI_SR_TXE)){}; //PGA_BYPASS = 1
  228. SPI1->DR = 0x44; //WREG
  229. while(!(SPI1->SR & SPI_SR_TXE)){};
  230. SPI1->DR =0xC4;
  231. while(!(SPI1->SR & SPI_SR_TXE)){}; //1000sps , CM = 1
  232. SPI1->DR = 0x8; //start/sync
  233. while(!(SPI1->SR & SPI_SR_TXE)){};
  234. SPI1->DR =0x48;
  235. while(!(SPI1->SR & SPI_SR_TXE)){};
  236. SPI1->DR =0x20;
  237. while(!(SPI1->SR & SPI_SR_TXE)){}; //50hz rejection
  238. SPI1->DR =0x4C;
  239. while(!(SPI1->SR & SPI_SR_TXE)){};
  240. SPI1->DR =0x0;
  241. while(!(SPI1->SR & SPI_SR_TXE)){}; // ничего
  242. while(SPI1->SR & SPI_SR_BSY){};
  243. GPIOA->BSRR |= GPIO_BSRR_BS4; //CHIPSELECT HIGH
  244. i = 1000000;
  245. while(i >= 0){
  246. --i;
  247. }
  248.  
  249. }
  250. float ADC_READ(){
  251. GPIOA->BSRR |= GPIO_BSRR_BR4; //CHIPSELECT LOW
  252. while(SPI1->SR & SPI_SR_BSY){};
  253. SPI1->DR = 0;
  254. while(SPI1->SR & SPI_SR_BSY){};
  255. data[0] = SPI1->DR; //чтение первых 8 бит
  256.  
  257. SPI1->DR = 0;
  258. while(SPI1->SR & SPI_SR_BSY){};
  259. data[1] = SPI1->DR; //ещё 8
  260.  
  261. SPI1->DR = 0;
  262. while(SPI1->SR & SPI_SR_BSY){};
  263. data[2] = SPI1->DR; // и ещё
  264.  
  265. tempc = data[0];
  266. tempc <<= 8;
  267. tempc = tempc | data[1];
  268. tempc <<= 8;
  269. tempc = tempc | data[2]; //складывание элементов массива
  270. voltage = tempc * 0.000000298023; //множитель из таблицы ADS1220
  271. while(SPI1->SR & SPI_SR_BSY){};
  272. GPIOA->BSRR |= GPIO_BSRR_BS4; //CHIPSELECT HIGH
  273. return voltage;
  274. }
  275. int main(void)
  276. {
  277. double vol;
  278. RCC_init();
  279. GPIO_init();
  280. usart1_init();
  281. spi1_init();
  282. DISPLAY_init();
  283. displaydata();
  284. ADC_init();
  285. vol = ADC_READ();
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement