Thông báo

Collapse
No announcement yet.

Cùng nhau trao đổi về STM8

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Em bắt đầu học STM8 (STM8S103FP3). Phần mềm IAR. Ngôn ngữ C. Em thấy nếu sử dụng thư viện của ST, để truyền được các tham số vào hàm thì vẫn phải đọc hiểu phần cứng thì mới biết mình cần gì và phải chọn tham số như thế nào chứ không ăn sổi ngay được. Em muốn tự code(Như là 8051 ngày xưa) để hiểu hơn về phần cứng. Mong mọi người giúp đỡ. Em chỉ include mỗi: #include "iostm8.h"

    Em đã thử với các thanh ghi IO và code đã chạy. Giờ em muốn thử với ngắt. Em chưa tìm thấy bit ngắt toàn cục (GLOBAL) nằm ở thanh ghi nào. Làm thế nào để cho phép ngắt toàn cục. (giống như bit EA trong 8051 hay bit GIE trong PIC ấy). Mong mọi người chỉ giáo.

    Comment


    • enable interrupt: rim();
      disable interrupt: sim();
      Thư viện ST là chuẩn rồi, mới đầu chưa hiểu có thể thấy nó hơi rối, dùng nhiều rồi quen thôi mà, viết lại thư viện cũng được, nhưng khá mất thời gian và biết cóa viết đúng hay không lúc đó vừa debug gải thuật vừa debug lib thì kỳ lắm nha...

      Comment


      • Không được anh ah. Trình biên dịch nó không hiểu 2 hàm đó. Em sẽ thử song song 2 cách tiếp cận. em muốn hiểu được cả phần cứng chứ không chỉ code.

        Comment


        • bác thiếu include stm8s.h roài

          Comment


          • Cho em hỏi:
            Trong Timer1 (TIM1) em thấy có các thanh ghi:
            +TIM1_RCR (Thanh ghi Repetition counter). Em đọc nhưng chưa hiểu nó hoạt động thế nào ?
            +Các thanh ghi Preload, và Shadow: 2 cái tên này liên tục được nhắc tới nhưng hình như nó không được đánh địa chỉ (Em tìm không thấy) và không biết nó hoạt động thế nào.

            Ai ghé qua thì chỉ cho em với. Em cảm ơn.

            Comment


            • Nguyên văn bởi nguyenvanvui Xem bài viết
              các ứng dụng về timer các bạn xem tại đây:
              TIM1andTIM4
              file dowload về đựoc nhưng bị đạt pass. Họ bảo gửi mail cho họ để họ cho pass. Em gửi mail mà không thấy phản hồi. Anh còn file đó không gửi cho em xin với.

              Comment


              • và em đã làm đc. nạp cho con stm8s003f3 chạy dc các chân PC3, PC7 vui ghê lum các bác ạ. con này hay quáhttps://www.facebook.com/video.php?v...r&notif_t=likeClick image for larger version

Name:	P_20141023_201113.jpg
Views:	1
Size:	82.2 KB
ID:	1399518
                Heo Ma Mút

                Comment


                • Mình mới bắt đầu với STM8 và sử dụng IAR, đang gặp rắc rối với Option Bytes của IAR, mình dùng chip STM8S105C6T6. Mình so sánh Option Bytes của IAR và Option Bytes của STVP thì thấy khác nhiều mục, mình đã tìm kiếm trong tất cả các tài liệu của ST nhưng đều không tìm được câu trả lời thỏa đáng, hoặc cũng có thể do mình đã bỏ sót. Post lên đây, mong được các bạn và các anh giúp đỡ. Các mục khác nhau gồm:

                  Đối với Option Bytes của IAR:
                  _ UBC: Write protection disabled và Write protected
                  _ I2C: có hai tùy chọn Frozen when stopped và Running.
                  _ Timer1: có hai tùy chọn Frozen when stopped và Running.
                  _ Timer2: có hai tùy chọn Frozen when stopped và Running.
                  _ Timer3: có hai tùy chọn Frozen when stopped và Running.
                  _ Timer4:có hai tùy chọn Frozen when stopped và Running.

                  Đối với Option Bytes của STVP:
                  _ UBC[7..0]: 8 bit có các tùy chọn 0 và 1
                  _ BOOTLOADER ENABLE: Bootloader Disabled và Bootloader enabled.

                  Thắc mắc của mình là:
                  1. Bên IAR không có BOOTLOADER ENABLE thì nó được khởi tạo ở chỗ nào???
                  2. Các option Frozen when stopped và Running của I2C, Timer[1..4] nghĩa là gì? Tại sao bên STVP lại không có? Và trong các tài liệu của ST cũng không thấy đề cập đến dòng chữ Frozen when stopped!!!
                  3. Đối với UBC thì mình nghĩ là: bên STVP mình phải tự chọn cho các bit UBC[7..0] phù hợp từ trang 0 đến trang 63 cho User boot code area ; còn bên IAR nó tự chọn cho mình hoặc là 0 hoặc là 64 trang bộ nhớ là User Boot Code Area, nếu thế thì tốn tài nguyên quá nhỉ? Hay là IAR tự nó tùy chỉnh cái User boot code area này? Thật khó để diễn tả chỗ này, mong các bạn thông cảm. Theo mình hiểu User Boot Code Area là vùng nhớ để lưu đoạn chương trình bootloader phải không?

                  Cám ơn mọi người!

                  Comment


                  • stvp là Programmer không phải là IDE dùng để code như IAR.

                    Option Bytes của IAR cho ST-LINK for STM8 sử dụng với mục đích debugger và nó chỉ nhằm mục đích debugger không Programmer.
                    Từ chối trách nhiệm:
                    Mọi thông tin từ ITX cung cấp với hi vọng nó có ích và không đi kèm với bất kì sự bảo đảm nào.
                    Blog: http://mritx.blogspot.com

                    Comment


                    • Vậy còn cái Frozen when stopped nghĩa là gì vậy anh? À, tiện đây rất cám ơn anh về thuốc cho IAR trên blog của anh, dùng rất tốt!

                      Comment


                      • Nhớ không lầm thì.
                        Khi bật Frozen when stopped thì lúc debugger bộ đếm, Timer sẽ Frozen = đóng băng (không hoạt động, tạm dừng) khi cpu stop. Hữu dụng khi debugger dạng time cho rtc chẳng hạn.
                        Nói chung đây là Option Bytes chỉ có khi debugger.

                        Nhất thời chỉ nhớ như vậy, muốn chi tiết xem mấy cái tài liệu nói về SWIM hay debug module.
                        Từ chối trách nhiệm:
                        Mọi thông tin từ ITX cung cấp với hi vọng nó có ích và không đi kèm với bất kì sự bảo đảm nào.
                        Blog: http://mritx.blogspot.com

                        Comment


                        • Chào mọi người, mình đang code giao tiếp I2C trên STM8S003F3 nhưng gặp lỗi. Đầu tiên mình khởi tạo xung clock
                          Code:
                          CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
                          	
                          	CLK_PeripheralClockConfig(TCS34725_I2C_CLK, ENABLE);
                          	/* I2C configuration */
                            /* sEE_I2C Peripheral Enable */
                            I2C_Cmd( ENABLE);
                            /* sEE_I2C configuration after enabling it */
                            I2C_Init(I2C_MAX_FAST_FREQ, TCS34725_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
                          Sau đó đọc I2C thì bị lỗi:

                          Code:
                          TCS34725_TimeOut = DEFAULT_TIMEOUT;
                          	while(I2C_GetFlagStatus( I2C_FLAG_BUSBUSY))
                            {
                              if((TCS34725_TimeOut--) == 0) return 99;
                            }
                          	
                          	I2C_GenerateSTART(ENABLE);
                          	I2C_Send7bitAddress(TCS34725_ADDRESS7, TCS34725_DIRECTION_TX);
                          	
                          	/* Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */
                            TCS34725_TimeOut = DEFAULT_TIMEOUT;
                            while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT))
                            {
                              if((TCS34725_TimeOut--) == 0) return 88;
                            }
                          	
                          	/* Test on EV6 and clear it */
                            TCS34725_TimeOut = DEFAULT_TIMEOUT;
                            while(!I2C_CheckEvent( I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
                            {
                              if((TCS34725_TimeOut--) == 0) return 77;
                            } 
                          	
                          	/* Test on EV8 and clear it */
                            TCS34725_TimeOut = DEFAULT_TIMEOUT;
                            while(I2C_GetFlagStatus(I2C_FLAG_TRANSFERFINISHED) == RESET)
                            {
                              if((TCS34725_TimeOut--) == 0) return 66;
                            }
                            
                            /* Send START condition a second time */  
                            I2C_GenerateSTART( ENABLE);
                            
                            /* Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */
                            TCS34725_TimeOut = DEFAULT_TIMEOUT;
                            while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT))
                            {
                              if((TCS34725_TimeOut--) == 0) return 55;
                            } 
                            
                            /* Send EEPROM address for read */
                            //I2C_Send7bitAddress(TCS34725_ADDRESS7 , I2C_DIRECTION_RX);
                          	I2C_Send7bitAddress(addr , I2C_DIRECTION_RX);
                          	
                          	
                          	/* Wait on ADDR flag to be set (ADDR is still not cleared at this level */
                          		TCS34725_TimeOut = DEFAULT_TIMEOUT;
                              while(I2C_GetFlagStatus( I2C_FLAG_ADDRESSSENTMATCHED) == RESET)
                              {
                                if((TCS34725_TimeOut--) == 0) return 44;
                              } 
                                 
                              /* Disable Acknowledgement */
                              I2C_AcknowledgeConfig(I2C_ACK_NONE);   
                          
                              /* Call User callback for critical section start (should typically disable interrupts) */
                              //sEE_EnterCriticalSection_UserCallback();
                              
                              /* Clear ADDR register by reading SR1 then SR3 register (SR1 has already been read) */
                              (void)TCS34725_I2C->SR3;
                              
                              /* Send STOP Condition */
                              I2C_GenerateSTOP( ENABLE);
                             
                              /* Call User callback for critical section end (should typically re-enable interrupts) */
                              //sEE_ExitCriticalSection_UserCallback();
                              
                              /* Wait for the byte to be received */
                              TCS34725_TimeOut = DEFAULT_TIMEOUT;
                              while(I2C_GetFlagStatus( I2C_FLAG_RXNOTEMPTY) == RESET)
                              {
                                if((TCS34725_TimeOut--) == 0) return 33;
                              }
                              
                              /* Read the byte received from the EEPROM */
                              tmp = I2C_ReceiveData();
                              
                              /* Decrement the read bytes counter */
                              //(uint16_t)(*NumByteToRead)--;        
                              
                              /* Wait to make sure that STOP control bit has been cleared */
                              TCS34725_TimeOut = DEFAULT_TIMEOUT;
                              while(TCS34725_I2C->CR2 & I2C_CR2_STOP)
                              {
                                if((TCS34725_TimeOut--) == 0) return 22;
                              }  
                              
                              /* Re-Enable Acknowledgement to be ready for another reception */
                              I2C_AcknowledgeConfig( I2C_ACK_CURR);
                          Sau khi I2C_GenerateSTART(ENABLE); thì nó báo cờ I2C_FLAG_BUSBUSY, nhờ các tiền bối gỡ giúp lỗi này.

                          Mạch kết nối 2 ngoại vi i2c trên cùng 1 bus, điạ chỉ lần lượt là 0x29 và 0x39.

                          Comment


                          • chào anh e! cho mình hỏi:
                            làm thế nào để biết dung lượng code mình đang viết cho tm8s vậy? Mình đang dùng STVD và STVP
                            Cảm ơn các anh e trước nha!

                            Comment


                            • Nguyên văn bởi vaa_dtvn Xem bài viết
                              Chào mọi người, mình đang code giao tiếp I2C trên STM8S003F3 nhưng gặp lỗi. Đầu tiên mình khởi tạo xung clock
                              Code:
                              CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
                              	
                              	CLK_PeripheralClockConfig(TCS34725_I2C_CLK, ENABLE);
                              	/* I2C configuration */
                                /* sEE_I2C Peripheral Enable */
                                I2C_Cmd( ENABLE);
                                /* sEE_I2C configuration after enabling it */
                                I2C_Init(I2C_MAX_FAST_FREQ, TCS34725_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
                              Sau đó đọc I2C thì bị lỗi:

                              Code:
                              TCS34725_TimeOut = DEFAULT_TIMEOUT;
                              	while(I2C_GetFlagStatus( I2C_FLAG_BUSBUSY))
                                {
                                  if((TCS34725_TimeOut--) == 0) return 99;
                                }
                              	
                              	I2C_GenerateSTART(ENABLE);
                              	I2C_Send7bitAddress(TCS34725_ADDRESS7, TCS34725_DIRECTION_TX);
                              	
                              	/* Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */
                                TCS34725_TimeOut = DEFAULT_TIMEOUT;
                                while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT))
                                {
                                  if((TCS34725_TimeOut--) == 0) return 88;
                                }
                              	
                              	/* Test on EV6 and clear it */
                                TCS34725_TimeOut = DEFAULT_TIMEOUT;
                                while(!I2C_CheckEvent( I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
                                {
                                  if((TCS34725_TimeOut--) == 0) return 77;
                                } 
                              	
                              	/* Test on EV8 and clear it */
                                TCS34725_TimeOut = DEFAULT_TIMEOUT;
                                while(I2C_GetFlagStatus(I2C_FLAG_TRANSFERFINISHED) == RESET)
                                {
                                  if((TCS34725_TimeOut--) == 0) return 66;
                                }
                                
                                /* Send START condition a second time */  
                                I2C_GenerateSTART( ENABLE);
                                
                                /* Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */
                                TCS34725_TimeOut = DEFAULT_TIMEOUT;
                                while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT))
                                {
                                  if((TCS34725_TimeOut--) == 0) return 55;
                                } 
                                
                                /* Send EEPROM address for read */
                                //I2C_Send7bitAddress(TCS34725_ADDRESS7 , I2C_DIRECTION_RX);
                              	I2C_Send7bitAddress(addr , I2C_DIRECTION_RX);
                              	
                              	
                              	/* Wait on ADDR flag to be set (ADDR is still not cleared at this level */
                              		TCS34725_TimeOut = DEFAULT_TIMEOUT;
                                  while(I2C_GetFlagStatus( I2C_FLAG_ADDRESSSENTMATCHED) == RESET)
                                  {
                                    if((TCS34725_TimeOut--) == 0) return 44;
                                  } 
                                     
                                  /* Disable Acknowledgement */
                                  I2C_AcknowledgeConfig(I2C_ACK_NONE);   
                              
                                  /* Call User callback for critical section start (should typically disable interrupts) */
                                  //sEE_EnterCriticalSection_UserCallback();
                                  
                                  /* Clear ADDR register by reading SR1 then SR3 register (SR1 has already been read) */
                                  (void)TCS34725_I2C->SR3;
                                  
                                  /* Send STOP Condition */
                                  I2C_GenerateSTOP( ENABLE);
                                 
                                  /* Call User callback for critical section end (should typically re-enable interrupts) */
                                  //sEE_ExitCriticalSection_UserCallback();
                                  
                                  /* Wait for the byte to be received */
                                  TCS34725_TimeOut = DEFAULT_TIMEOUT;
                                  while(I2C_GetFlagStatus( I2C_FLAG_RXNOTEMPTY) == RESET)
                                  {
                                    if((TCS34725_TimeOut--) == 0) return 33;
                                  }
                                  
                                  /* Read the byte received from the EEPROM */
                                  tmp = I2C_ReceiveData();
                                  
                                  /* Decrement the read bytes counter */
                                  //(uint16_t)(*NumByteToRead)--;        
                                  
                                  /* Wait to make sure that STOP control bit has been cleared */
                                  TCS34725_TimeOut = DEFAULT_TIMEOUT;
                                  while(TCS34725_I2C->CR2 & I2C_CR2_STOP)
                                  {
                                    if((TCS34725_TimeOut--) == 0) return 22;
                                  }  
                                  
                                  /* Re-Enable Acknowledgement to be ready for another reception */
                                  I2C_AcknowledgeConfig( I2C_ACK_CURR);
                              Sau khi I2C_GenerateSTART(ENABLE); thì nó báo cờ I2C_FLAG_BUSBUSY, nhờ các tiền bối gỡ giúp lỗi này.

                              Mạch kết nối 2 ngoại vi i2c trên cùng 1 bus, điạ chỉ lần lượt là 0x29 và 0x39.
                              bạn xem phần cứng kết nối đúng chưa? không đúng nó sẽ báo lỗi đó
                              Lập Trình theo yêu cầu STM8S,MSP430,89S,Giải mã remote

                              Comment


                              • Nguyên văn bởi huunho1 Xem bài viết
                                bạn xem phần cứng kết nối đúng chưa? không đúng nó sẽ báo lỗi đó
                                Mạch đúng và chạy đc bình thường nhé bạn. Mình viết code i2c mềm chạy được ngon lành và vẫn dùng i2c mềm tới giờ vì chưa có tời gian quay lại tìm hiểu nguyên nhân lỗi i2c cứng.

                                Comment

                                Về tác giả

                                Collapse

                                sugus Tìm hiểu thêm về sugus

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X